我只想知道当开始产生多个JVM进程时,JavaVM (Sun,Linux)的实际占用空间是多少。当我记得很清楚的时候,它们应该共享rt.jar (也许更远?)。这些JVM是否共享JIT缓存(所有JVM都具有相同的类路径)?
我能做些什么来减少多实例JVM的开销吗?(除了为堆设置更小的限制之外)?
在编写应用程序时,我可以做些什么?
我可以共享内存区域吗?也许可以共享映射的内存块?
发布于 2016-07-24 21:36:59
This post描述了Java应用程序内存占用的构成。也就是说,如果你想减少内存占用,你需要减少这些部分: Java堆,Metaspace,代码缓存,直接缓冲区,线程数量等。
HotSpot JVM的实例之间不会为了共享数据而相互通信。它们基本上不共享任何东西,除了操作系统共享的东西,即动态库(.so)和只读内存映射文件(.jars)。
这取决于应用程序通过IPC机制提供进一步的共享,例如内存映射文件。
发布于 2016-07-24 21:33:48
这可能只是一个部分的答案。
JVM的内存占用量是多少?
Java应用程序的全部内存使用量由堆空间和非堆空间组成(我这样叫它)。仅举几个驻留在非堆空间中的示例: PermGen或Metaspace,直接从代码分配(malloc),NIO也使用本机内存。
如何最小化它?
堆通常占据了内存占用的最大部分。所以,我会从它开始。
至于非堆空间,您可以最小化: PermGen (如果您的最大大小是冗余的),线程堆栈(它们相当大,特别是在64位JMMs中)和代码缓存(当然是为了提高性能)。
这些JVM是否共享JIT缓存?
在正常情况下(我不知道其他情况),每个进程都有自己的内存占用空间。这实际上是进程与线程的不同之处。回到多个JVM,每个JVM都是一个单独的进程。
应该共享rt.jar
当然,如果您从相同的目录(相同的安装)启动Java,它们将共享相同的rt.jar,但只是作为类的源。例如,String类的加载次数与正在运行的JVM的数量一样多。
发布于 2016-09-13 01:03:40
为了补充其他答案,这里有几篇有见地的文章,列出了典型的JVM内存足迹值以及度量它们的方法:
https://spring.io/blog/2015/12/10/spring-boot-memory-performance
http://trustmeiamadeveloper.com/2016/03/18/where-is-my-memory-java/
https://stackoverflow.com/questions/38552250
复制相似问题