Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JMX与htop报告的Java内存_Java_Linux_Memory - Fatal编程技术网

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