Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.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
Java 为什么?第一个gc为什么终身制:8192K->8961K(10240K)?_Java_Out Of Memory - Fatal编程技术网

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