Java类库是否在进程间共享内存?
Java类库是否在进程间共享内存?
这个问题问得很贴合实际场景!先顺着你提到的Linux原生.so库的情况说:当多个进程共用同一个.so时,系统确实只会把它的机器码加载一次,并且将这块内存标记为只读,让所有用到它的进程共享,避免重复加载浪费资源。
那回到Java的.jar类库,答案其实是分情况,而且和JRE(准确说是JVM)的实现密切相关,具体可以拆成这几个维度看:
- 首先要明确:每个Java程序都是跑在独立的JVM进程里的,而操作系统层面不同进程的内存空间是相互隔离的——这是进程的基本特性,所以默认情况下,不同JVM进程之间的
.jar字节码是不会共享的,每个JVM都会自己读取.jar文件,把字节码加载到自己的进程内存里。 - 但在同一个JVM进程内部,如果是同一个类加载器加载同一个
.jar里的类,字节码只会被加载一次,在JVM内部共享。不过要是不同的类加载器加载同一个类(比如Web容器里的不同应用各自用独立类加载器),那这个类会被JVM当成完全不同的类,字节码也会重复加载。 - 当然也有例外情况:部分JVM实现提供了跨进程的类共享优化。比如Oracle JDK的
-XX:+UseSharedSpaces参数(部分版本支持),可以让多个JVM共享类数据的只读部分;还有OpenJ9这类JVM,自带的**共享类缓存(Shared Class Cache)**功能,能让多个JVM进程共享已加载的类字节码甚至是编译后的机器码,以此减少内存占用和启动时间。
总结一下:默认状态下,不同Java进程的.jar字节码不会共享内存,但部分JVM通过特定配置或自身优化可以实现跨进程共享,具体要看你使用的JVM版本和相关设置。
备注:内容来源于stack exchange,提问作者zomega
相关产品推荐
相关产品推荐

