当先锋百科网

首页 1 2 3 4 5 6 7

Java是一门高级编程语言,具有面向对象、通用和高可移植的特性,广泛应用于企业级软件开发、手机应用开发、游戏开发等领域。在Java虚拟机中,内存分为年轻代和老年代两部分,分别对应年轻代区和老年代区。

其中年轻代区又分为Eden区和两个Survivor区,主要负责新创建的对象,当Eden区满了时,触发Minor GC(小型垃圾回收),将Eden区和Survivor区中没有被引用的对象回收掉,留下有用的对象存放在Survivor区。Survivor区指针会指向两个Survivor区其中的一个,第一次触发Minor GC时,会将Survivor区中所有可达的对象复制到另一个Survivor区中,第二次触发Minor GC时,再将Survivor区和另一个Survivor区中没有被引用的对象回收掉,存活的对象移动到老年代区。

而老年代区主要存放在年轻代或Survivor区中存活的对象,当老年代区满了时,触发Full GC(全局垃圾回收),将所有没有被引用的对象回收掉。Full GC的次数越多,应用程序的性能就越低下。

//Java代码示例
public class MemoryTest {
public static void main(String[] args) {
byte[] array1 = new byte[1024 * 1024 * 2]; // 申请2MB内存
System.out.println("array1申请了2MB内存");
byte[] array2 = new byte[1024 * 1024 * 8]; // 申请8MB内存
System.out.println("array2申请了8MB内存");
byte[] array3 = new byte[1024 * 1024 * 2]; // 申请2MB内存
System.out.println("array3申请了2MB内存");
try {
Thread.sleep(10000); // 暂停10秒钟
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

上面的代码示例中,通过new关键字创建了三个数组,分别申请了2MB、8MB、2MB的内存。该程序运行时会在年轻代区中分配内存,随着程序的运行,年轻代区满了会触发Minor GC,将没有被引用的对象回收掉,只留下还在使用的对象存放在Survivor区中。当Survivor区也满了后,将存活的对象移动到老年代区中。当老年代区满了,再触发Full GC,将所有没有被引用的对象回收掉。