[讨论] 一个奇怪的问题

xgj1988 2011-04-20
我在运行java程序的时候设置了如下JVM 虚拟机参数

-Xms20m -Xmx100m -XX:PermSize=100m -XX:MaxPermSize=100m

但是为打出来的结果不对呢?

public class Test {
	private byte[] bytes = new byte[1024 * 1024];

	@Override
	protected void finalize() throws Throwable {
		// TODO Auto-generated method stub
		super.finalize();

		System.out.println("finalize");
	}

	public static void main(String[] args) throws Exception {
		// for (int i = 0; i < 10; i++) {
		// Test t = new Test();
		// systeminfo(i);
		// }
		// System.out.println("over");
		// systeminfo(1);

		MemoryMXBean memoryMXBean = ManagementFactory.getMemoryMXBean();
		System.out.println("堆最大内存"
				+ change(memoryMXBean.getHeapMemoryUsage().getMax()));
		System.out.println("堆初始化内存大小"
				+ change(memoryMXBean.getHeapMemoryUsage().getInit()));
		System.out.println(memoryMXBean.getHeapMemoryUsage());
		System.out.println(memoryMXBean.getHeapMemoryUsage().hashCode());
		System.out.println("=================");
		System.out.println("非堆最大内存"
				+ change(memoryMXBean.getNonHeapMemoryUsage().getMax()));
		System.out.println("非堆初始化内存大小"
				+ change(memoryMXBean.getNonHeapMemoryUsage().getInit()));
		System.out.println(memoryMXBean.getNonHeapMemoryUsage());
		System.out.println(memoryMXBean.getNonHeapMemoryUsage().hashCode());

	}

	 

	private static String change(long l) {
		return (l / 1000 / 1000) + "M";
	}
}


打出来的结果是

堆最大内存104M
堆初始化内存大小20M
init = 20971520(20480K) used = 349104(340K) committed = 20840448(20352K) max = 104071168(101632K)
11077203
=================
非堆最大内存159M
非堆初始化内存大小126M
init = 126025728(123072K) used = 12352584(12063K) committed = 126320640(123360K) max = 159383552(155648K)
14576877


堆的打出来的结果好像算正常的,但是非堆区域为什么相差如此之大?
RednaxelaFX 2011-04-20
话说byte到MB之间的转换应该是value / 1024 / 1024,或者说value >> 20。

你是在什么操作系统、怎样的配置环境、哪个JDK上跑的呢?
在Windows上的话,HotSpot默认会用client VM。这会影响non-heap区域的内容。
有兴趣的话你可以开jconsole看看内存那个tab下non-heap的构成,留意code cache不是perm gen的一部分,所以它的大小不受PermSize或MaxPermSize控制。
xgj1988 2011-04-21
RednaxelaFX 写道
话说byte到MB之间的转换应该是value / 1024 / 1024,或者说value >> 20。

你是在什么操作系统、怎样的配置环境、哪个JDK上跑的呢?
在Windows上的话,HotSpot默认会用client VM。这会影响non-heap区域的内容。
有兴趣的话你可以开jconsole看看内存那个tab下non-heap的构成,留意code cache不是perm gen的一部分,所以它的大小不受PermSize或MaxPermSize控制。



我用 jconsole 查看 ,为什么 本地进程 的test这个类会是灰色的呢?不可选。
xgj1988 2011-04-21
原来我的项目是jdk5.0的,jconsole是1.6所以灰色。
RednaxelaFX 2011-04-21
xgj1988 写道
原来我的项目是jdk5.0的,jconsole是1.6所以灰色。

JDK是1.5的话那要在启动的时候加参数就不灰了
-Dcom.sun.management.jmxremote
Global site tag (gtag.js) - Google Analytics