JVM 的内存占用是多少?如何最大限度地减少它?

问题描述 投票:0回答:3

我只是想知道当开始生成多个 JVM 进程时,JavaVM(Sun、Linux)的实际占用空间是多少。当我记得清楚时,那些应该共享 rt.jar(也许超出?)。这些 JVM 是否共享 JIT 缓存(所有 JVM 都具有相同的类路径)?

我可以做些什么来减少多实例 JVM 的开销吗? (除了为堆设置较小的限制之外)?

在对应用程序进行编程时我可以做些什么?

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

java memory jvm memory-footprint
3个回答
6
投票

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

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

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


5
投票

可能这只是部分答案。

JVM 的内存占用是多少

Java 应用程序的完整占用空间由堆空间和非堆空间(让我这样称呼它)组成。仅举几个驻留在非堆空间中的示例:PermGen 或 Metaspace、从代码直接分配 (malloc)、NIO 还使用本机内存。

我怎样才能最小化它?

堆通常占据占用空间的最大部分。所以,我会从它开始。

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

那些 JVM 共享 JIT 缓存吗

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

应该共享 rt.jar

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


4
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.