JVM的内存占用量是多少?如何最小化它?

时间:2016-07-24 12:52:58

标签: java memory jvm memory-footprint

我只是想知道当一个人开始生成多个JVM进程时,JavaVM(Sun,Linux)的实际占用空间是多少。当我记得那些应该分享rt.jar(也许超越?)。那些JVM是否共享JIT缓存(所有JVM功能都是相同的Classpath)?

有什么办法可以减少多实例JVM的开销吗? (除了为堆设置较小的限制)?

编程应用程序时我能做些什么?

我可以共享内存区域吗?也许共享映射的内存块?

3 个答案:

答案 0 :(得分:5)

This post描述了构成Java应用程序占用空间的原因。也就是说,如果你想减少占用空间,你需要减少这些部分:Java堆,元数据空间,代码缓存,直接缓冲区,线程数等。

HotSpot JVM的实例不会相互通信以共享数据。基本上它们除了操作系统共享的东西之外什么也没有共享,即动态库(.so)和只读内存映射文件(.jars)。

应用程序通过IPC机制提供进一步的共享,例如:内存映射文件。

答案 1 :(得分:4)

可能只是部分答案。

  

JVM的内存占用量是多少

Java应用程序的完整足迹包括堆空间和非堆空间(让我用这种方式调用它)。只是几个非堆空间中的例子:PermGen或Metaspace,从代码(malloc)中直接分配,NIO也使用本机内存。

  

我该如何最小化它?

堆通常占据你足迹的最大部分。所以,我会从它开始。

对于非堆空间,您可以最小化:PermGen(如果最大大小是冗余的),线程堆栈(它们非常大,特别是在64位JMM中)和代码缓存(当然是性能问题) )。

  

那些JVM是否共享JIT缓存

在正常情况下(我并不知道其他人),每个流程都有自己的足迹。实际上,这与流程的不同之处在于。回到多个JVM,每个JVM都是一个独立的过程。

  

应该分享rt.jar

如果从同一目录(相同的安装)启动Java,当然,它们共享相同的rt.jar,但仅作为类的源。例如,String类将与许多正在运行的JVM一样多次加载。

答案 2 :(得分:3)

为了补充其他答案,这里有几篇富有洞察力的文章列出了典型的JVM内存占用值及其测量方法:

https://spring.io/blog/2015/12/10/spring-boot-memory-performance

http://trustmeiamadeveloper.com/2016/03/18/where-is-my-memory-java/