我在我的 eclipse 中进行开发进行 JVM 参数测试,但是打印出来的 gc 信息和我预想(从书上看)的不一样,找了很多答案也不知道为什么,求大神指点呀!
public class OutOfMemoryTest {
@Test
public void heapOutOfMemory() throws InterruptedException {
//-Xmx4M -Xms4M -Xmn2M -XX:+PrintGCDetails
//Thread.sleep(40000);
byte[] b = new byte[2*1024*1024];
}
}
按照道理来说我设置堆得大小为 4M ,且不可扩展, young 区的大小为 2M ,那么 old 区的大小也应该为 2M,但是为什么 eclipse 中打印出来的 gc 信息是这样的?
Heap
PSYoungGen total 1536K, used 745K [0x00000000ffe00000, 0x0000000100000000, 0x0000000100000000)
eden space 1024K, 25% used [0x00000000ffe00000,0x00000000ffe40628,0x00000000fff00000)
from space 512K, 95% used [0x00000000fff80000,0x00000000ffffa020,0x0000000100000000)
to space 512K, 0% used [0x00000000fff00000,0x00000000fff00000,0x00000000fff80000)
ParOldGen total 4608K, used 2993K [0x00000000ff800000, 0x00000000ffc80000, 0x00000000ffe00000)
object space 4608K, 64% used [0x00000000ff800000,0x00000000ffaec558,0x00000000ffc80000)
PSPermGen total 262144K, used 5380K [0x00000000ef800000, 0x00000000ff800000, 0x00000000ff800000)
object space 262144K, 2% used [0x00000000ef800000,0x00000000efd41350,0x00000000ff800000)
我用 jmap 打印出来的结果也是这样, old 区的大小已经大于我整个堆得大小了? 然后我将代码修改成了这样
@Test
public void heapOutOfMemory() throws InterruptedException {
//-Xmx64M -Xms64M -Xmn32M -XX:+PrintGCDetails
byte[] b = new byte[32*1024*1024];
}
打印出来的信息就正确了, old 区的大小就是 32M 了。打印结果如下:
Heap
PSYoungGen total 28672K, used 1966K [0x00000000fe000000, 0x0000000100000000, 0x0000000100000000)
eden space 24576K, 8% used [0x00000000fe000000,0x00000000fe1eb9c0,0x00000000ff800000)
from space 4096K, 0% used [0x00000000ff800000,0x00000000ff800000,0x00000000ffc00000)
to space 4096K, 0% used [0x00000000ffc00000,0x00000000ffc00000,0x0000000100000000)
ParOldGen total 32768K, used 1292K [0x00000000fc000000, 0x00000000fe000000, 0x00000000fe000000)
object space 32768K, 3% used [0x00000000fc000000,0x00000000fc1432e8,0x00000000fe000000)
PSPermGen total 262144K, used 5421K [0x00000000ec000000, 0x00000000fc000000, 0x00000000fc000000)
object space 262144K, 2% used [0x00000000ec000000,0x00000000ec54b678,0x00000000fc000000)
但是我还是有一个疑问:为什么 eden:from 的比例不是 8 : 1. 我看了 jvm 虚拟机规范没有发现哪里有对这种情况的说明,是我做的方法不对,理解不对还是怎样的,求大家帮忙解答下。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.