Mat*_*iee 5 java memory memory-management heap-memory
我写了一个java应用程序,我在Fedora 24下运行了java进程。然后我检查了jconsole,发现它使用了大约5到10兆字节的内存。垃圾收集的效果在图中也可见。
然后我检查了我的系统监视器,发现相同的进程 ID 有超过 100 兆字节的内存使用量。
这是屏幕截图:
请告诉我为什么进程不释放未使用的内存?
有什么办法可以释放吗?
小智 6
使用的堆和分配的堆之间存在差异。图中的蓝线是已使用的堆 - 堆中有多少实际持有对象。未显示的是分配的堆的大小 - 这更大,通常更大,以便 JVM 可以分配更多对象而不会耗尽空间并且不必返回操作系统以获得更多内存(这是昂贵的)。在您的情况下,系统显示的 100mb 中的一些是 JVM 本身,但其中大部分可能已分配但未使用的堆。
当你运行一个 Java 程序而不指定你希望它使用的堆大小时,JVM 会尝试根据你的机器、操作系统、JVM 版本等找出合理的设置。当我在我的机器上运行一个简单的 16GB 的 Hello World 时在 RAM 和 Java 8 中,它最初为堆分配了 256mb。显然比它需要的要多得多!如果我想强制它使用 less 我可以使用-Xms命令行来设置初始堆分配并-Xmx设置允许的最大值。我的猜测是,如果您设置类似的-Xms20m内容,您的进程使用的内存就会减少。在 IntelliJ 中,将该设置添加到VM Options运行配置中的字段中。
| 归档时间: |
|
| 查看次数: |
8131 次 |
| 最近记录: |