JMX与htop报告的Java内存
我正在试着调试为什么一个程序打印出JMX与htop报告的Java内存,java,linux,memory,Java,Linux,Memory,我正在试着调试为什么一个程序打印出Hello,然后Thread.sleep(3600*1000)会在linux下(使用OpenJDK和Sun JVM)在CentOS 5和Ubuntu 10.04服务器上使用约404MB的虚拟内存。(分别为中等样本(dv)和中等样本(ve) 但更具体地说,当我使用VisualVM或JConsole连接时,我看到了合理的内存使用情况:820KM堆(在GC之后);8.4MB PermGen;加载了1136个类 为什么会有差异 纯粹是让JVM使用这么多内存运行吗?我试着
Hello
,然后Thread.sleep(3600*1000)
会在linux下(使用OpenJDK和Sun JVM)在CentOS 5和Ubuntu 10.04服务器上使用约404MB的虚拟内存。(分别为中等样本(dv)和中等样本(ve)
但更具体地说,当我使用VisualVM或JConsole连接时,我看到了合理的内存使用情况:820KM堆(在GC之后);8.4MB PermGen;加载了1136个类
为什么会有差异
纯粹是让JVM使用这么多内存运行吗?我试着启动两个Hello应用程序,看看内存使用量是否呈线性扩展,它确实做到了:
我开始时使用了78MB的总内存。启动一个hello应用程序会将内存使用率提高到376MB。启动另一个hello应用程序时,RAM的总使用量为656MB,因此内存似乎无法很好地共享。(这些数字不是虚拟内存
(这些特定数字是OpenJDK提供的,但使用Sun 6 JDK可以提供可压缩的内存使用率,但略低一些)
代码:
命令行:
java -Xmx32m -Xms32m Hello
对于JMX:
java -Dcom.sun.management.jmxremote.port=8005 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Xmx32m -Xms32m Hello
谢谢你的帮助
Wiktor堆只是Java使用的内存区域之一 看 PermGen是另一个可以指定允许使用多少Java的程序 每个线程都有一个虚拟机堆栈,您还可以限制其大小 有一个代码缓存或方法区域来存储编译后的代码 可能存在本机方法堆栈
内存映射文件或部分文件(如jar文件的索引)占用了进程(非堆)内存区域的一部分。澄清一下:Hello的RES内存为21MB(如预期的那样),SHR内存为8MB。两者都是合理的(对于Java;-)。我的问题是,虚拟内存使用量从2GB的总容量中减去,我需要运行约18个java应用程序。我尝试使用
ulimit-v
调整虚拟内存使用量,但除非将其设置为400000(400MB)左右,否则java应用程序无法成功启动。我尝试使用-Djava.awt.headless=true(使用Sun和OpenJDK)没有明显效果。对于giggles,我尝试使用gcj,它仍然报告使用了84MB,但关键的是内存使用不再线性扩展。一个hello应用程序将内存使用从78MB增加到119MB,启动另一个应用程序将增加到137MB。更合理。(这是我真正关心的扩展)感谢您的回复,您回答了我的问题。遗憾的是,这并不能完全解决我的问题,但这是另一篇文章。内存可能去向的好例子。但是,有没有具体步骤可以准确地了解Sun/OpenJDK java进程中内存的位置?第3.5节映射到JVM 7规范中的第2.5节。
java -Dcom.sun.management.jmxremote.port=8005 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Xmx32m -Xms32m Hello