我只是想知道当开始生成多个 JVM 进程时,JavaVM(Sun、Linux)的实际占用空间是多少。当我记得清楚时,那些应该共享 rt.jar(也许超出?)。这些 JVM 是否共享 JIT 缓存(所有 JVM 都具有相同的类路径)?
我可以做些什么来减少多实例 JVM 的开销吗? (除了为堆设置较小的限制之外)?
在对应用程序进行编程时我可以做些什么?
我可以共享内存区域吗?也许共享映射内存块?
这篇文章描述了 Java 应用程序足迹的组成部分。也就是说,如果你想减少占用空间,你需要减少这些部分:Java 堆、元空间、代码缓存、直接缓冲区、线程数等。
HotSpot JVM 的实例之间不会相互通信以共享数据。基本上,除了操作系统共享的内容之外,它们不共享任何内容,即动态库(.so)和只读内存映射文件(.jars)。
应用程序可以通过 IPC 机制提供进一步的共享,例如内存映射文件。
可能这只是部分答案。
JVM 的内存占用是多少
Java 应用程序的完整占用空间由堆空间和非堆空间(让我这样称呼它)组成。仅举几个驻留在非堆空间中的示例:PermGen 或 Metaspace、从代码直接分配 (malloc)、NIO 还使用本机内存。
我怎样才能最小化它?
堆通常占据占用空间的最大部分。所以,我会从它开始。
对于非堆空间,您可以最小化:PermGen(如果您最大大小是多余的),线程堆栈(它们非常大,特别是在64位JMM中)和代码缓存(当然是性能)。
那些 JVM 共享 JIT 缓存吗
在正常情况下(我不知道其他情况)每个进程都有自己的足迹。这实际上就是进程与线程的区别。回到多个 JVM,每个 JVM 都是一个单独的进程。
应该共享 rt.jar
如果从同一目录(同一安装)启动Java,当然,它们共享相同的rt.jar,但仅作为类的源。例如,String 类将被加载与运行的 JVM 数量一样多的次数。
为了补充其他答案,这里有几篇富有洞察力的文章,列出了典型的 JVM 内存占用值以及测量它们的方法:
https://spring.io/blog/2015/12/10/spring-boot-memory-performance
http://trustmeiamadeveloper.com/2016/03/18/where-is-my-memory-java/