当IntelliJ或Eclipse正在运行时,我可以从底部的进度条看到它们在应用程序内部使用了多少堆...它总是指示一个512 MB的子值,它是启动时分配的最大大小。 现在在很多情况下,如果我从操作系统(Linux)看,它说该应用程序使用大约1300 MB,我理解库,堆栈,内存映射文件,...不在堆中...... 但为什么差异那么大呢?通常有大约1GB的差异......为什么?
谢谢。
答案 0 :(得分:6)
JVM内存使用情况可以通过以下图像解释:
正如您所看到的,它不只是-Xmx
。总进程内存还包括-XX:PermSize
,所有线程的堆栈大小,JIT和其他内部使用的JVM内存。不要忘记也包含在进程内存中的内存映射文件。 IntelliJ IDEA将内存映射文件用于缓存,因此它可以添加几百兆字节。
如果您需要详细信息,请使用一些分析器,如JConsole或YourKit。
答案 1 :(得分:0)
值得记住的是,Java在启动时分配了最大堆大小,这显示在虚拟内存大小中。 (默认情况下,这与您拥有的内存量成比例)这可能比实际使用的主内存大得多。
我怀疑你正在看这个虚拟内存而不是常驻内存。
如果你在linux上使用pmap,你可以看到所有内存映射区域及其大小。
如果在Windows上使用打开的项目重新启动IntelliJ,它会使用35 MB的大约100 MB,最大使用494 M.在任务管理器中,它表示大小为173 MB私有,总共196 MB。