Java 为什么?第一个gc为什么终身制:8192K->8961K(10240K)?
我的代码:Java 为什么?第一个gc为什么终身制:8192K->8961K(10240K)?,java,out-of-memory,Java,Out Of Memory,我的代码: public class TestJVmRiZHI{ /** jdk 1.8 -XX:+UseSerialGC -verbose:gc -Xms20M -Xmx20m -Xmn10M -XX:+PrintGCDetails -XX:SurvivorRatio=8 * @param args */ private static final int _1mb = 1024 * 1024; public static void main(St
public class TestJVmRiZHI{
/**
jdk 1.8
-XX:+UseSerialGC
-verbose:gc
-Xms20M
-Xmx20m
-Xmn10M
-XX:+PrintGCDetails
-XX:SurvivorRatio=8
* @param args
*/
private static final int _1mb = 1024 * 1024;
public static void main(String[] args) {
Byte[] allocation1 = new Byte[2*_1mb];
Byte[] allocation2 = new Byte[2*_1mb];
Byte[] allocation3 = new Byte[2*_1mb];
Byte[] allocation4 = new Byte[4*_1mb];
}
}
结果:
主线程java.lang.OutOfMemoryError中出现异常:java堆空间
位于controller.TestJVmRiZHI.mainTestJVmRiZHI.java:24
[GC分配失败[DefNew:2540K->770K9216K,0.0034872秒]
[任期:8192K->8961K10240K,0.0071963秒]10732K->8961K19456K
[元空间:3385K->3385K1056768K],0.0107478秒][次数:user=0.01 sys=0.00,real=0.01秒]
[完全GC分配失败[终身:8961K->8943K10240K,0.0073261秒]8961K->8943K19456K[元空间:3385K->3385K1056768K],0.0073536秒][次数:用户=0.02系统=0.00,实值=0.01秒]
堆
def新一代总计9216K,使用410K[0x00000000fec00000,0x00000000ff600000,0x00000000ff600000
伊甸园空间8192K,使用率为5%[0x00000000fec00000,0x00000000fec66800,0x00000000ff400000
从空间1024K,0%已使用[0x00000000ff500000,0x00000000ff500000,0x00000000ff600000
对于空间1024K,0%已使用[0x00000000ff400000,0x00000000ff400000,0x00000000ff500000
终身发电总计10240K,使用8943K[0x00000000ff600000,0x0000000100000000,0x0000000100000000
空间10240K,87%已使用[0x00000000ff600000,0x00000000FFEBD38,0x00000000ffebbe00,0x0000000100000000
元空间使用3429K,容量4494K,提交4864K,保留1056768K
类空间已使用382K,容量386K,提交512K,保留1048576
字节[]是对象引用的数组
对象引用通常为4字节。在堆容量超过32 GB的64位计算机上,对象引用为8字节
假设4个字节,2*1024*1024*4=8MB
因此:
仅使用-Xmx20m时,内存就用完了
您可能是想让新字节[2*Ø1mb]分配2MB,所以逐字节更改,使数组是基本字节值的数组,而不是对象引用的数组。Um如果您分配1050万字节的对象,则需要160+MB的空间…@xTrollxDudex新字节[2*Ø1mb]只分配一个对象:2097152个引用的数组,全部为空。假设一个引用是4字节32位或CompressedOops,这意味着8 MB+对象头。啊,空引用…我的不好。tks,谢谢你,对象引用通常是4字节。抱歉,我有另一个问题。我将字节更改为字节。第一个gc:DefNew:6636K->781K9216K和最后,伊甸园空间8192K,使用率77%,永久性生成总计10240K,使用4096K。我认为字节[4*1Mb]应分配def新生成,gc分配永久性生成后的三字节[2*1Mb]应分配def新生成。
allocation1: 8 MB
allocation2: 8 MB
allocation3: 8 MB
allocation4: 16 MB
=====
total: 40 MB