淘先锋技术网

首页 1 2 3 4 5 6 7

Java虚拟机内存的分配主要是区域划分,常见的有年轻代和老年代。在内存分配时,对象会被分配到年轻代中,如果存活时间较长,会逐渐晋升到老年代。

新生代主要是由两个区域组成,分别是Eden区和两个Survivor区。每次内存分配时都会在Eden区进行,如果Eden区空间不足或对象超过了存活时间,则会被移动到Survivor区,Survivor区也有两个,分别为from和to。如果在一个Survivor区中存活时间过长或到达一定阈值,则需要晋升到老年代。

老年代则是存放无法回收的对象。由于老年代中的对象存活时间较长,因此内存分配时会经过多次GC扫描。当老年代空间不足时,会进行Full GC,整个JVM会暂停工作,这种情况会造成性能问题。

public static void main(String[] args) {
byte[] array1 = new byte[1024 * 1024];
array1 = new byte[1024 * 1024];
array1 = new byte[1024 * 1024];
array1 = null;
byte[] array2 = new byte[1024 * 1024 * 2];
}

以上为一个简单的Java代码示例,内存分配时,首先会在年轻代的Eden区中分配一个1MB的byte数组,然后再次分配1MB的数组,再次分配1MB的数组,这时Eden区中的空间已经被填满,之后将array1释放,这时Eden区中已没有对象。

接下来分配一个2MB的数组,由于年轻代中已经没有足够的空间进行分配,因此会触发GC,此时Eden区和Survivor区都没有存活对象,因此会将array1和array2移动到老年代中。