Java 库是否在进程之间共享内存?

Java 库是否在进程之间共享内存?

在 Linux 上,当两个进程(程序)使用同一个本机.so库时,它只会被加载一次。包含机器代码的内存在进程之间以只读方式共享,因此不必加载两次。

但是 Java 库呢.jar?字节码是否只加载一次并在进程之间共享?

也许这取决于 JRE?

答案1

运行pmap [-x] <pid>该进程来查看其具有内存映射的文件。

我认为 Java 库不太可能存在于.jar 可以可以共享,因为 .jar 是压缩Zip 存档 - 其中的代码不能直接由 JRE 执行,必须先解压缩,因此如果解压缩的数据必须存储在其他地方,那么共享存档就没有意义了。

(.so 对象能够自动共享的原因是它们只读映射直接由文件支持,而对于需要动态生成的解压缩字节码则不是这种情况。您提到的 .so 共享是可能的,因为程序不要只需打开每个 .so 并将其读入内存即可;地图文件放入内存,并且操作系统将其识别为“可共享”映射。)

其他运行时可能具有某种形式的缓存,例如.NET Framework 运行时具有 Ngen(本机图像生成器),它将 CLR 字节码预编译为以后可以直接映射的本机文件,但我没有听说过 Java JRE 具有这样的功能。

相关内容