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

Mar*_*ten 9 java memory jvm memory-footprint

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

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

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

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

apa*_*gin 6

这篇文章描述了构成Java应用程序足迹的原因.也就是说,如果您想减少占用空间,则需要减少这些部分:Java堆,元数据空间,代码缓存,直接缓冲区,线程数等.

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

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


Ave*_*Joe 5

可能这只是部分答案。

JVM的内存占用量是多少

Java应用程序的全部资源由堆空间和非堆空间组成(我这样称呼它)。仅举几个非堆空间中的例子:PermGen或Metaspace,从代码(malloc)进行直接分配,NIO也使用本机内存。

我怎样才能将其最小化?

通常,堆占您足迹的最大一部分。所以,我将从它开始。

至于非堆空间,您可以最小化:PermGen(如果最大大小是多余的),线程栈(它们非常大,尤其是在64位JMM中)和代码缓存(当然是提高性能)。

那些JVM是否共享JIT缓存

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

应该共享rt.jar

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