Java虚拟机将堆分为年轻代和老年代。其中,新生对象首先被分配到年轻代内存区域,而老年代则是存储生命周期比较长的对象。下面我们来了解一下关于年轻代和老年代的更多细节。
年轻代分为Eden区和Survivor区(From区和To区),其中,大部分新分配的对象都会被分配到Eden区域。当Eden区域满了之后,Java虚拟机会将活着的对象复制到Survivor区域的From区域中。在下一次垃圾回收时,活着的对象会被复制到To区域中。这样的操作称为Minor GC。
public class MyObject { byte[] bytes = new byte[1024 * 1024]; } public class Demo { public static void main(String[] args) { while (true) { for (int i = 0; i< 5; i++) { MyObject myObject = new MyObject(); } try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } }
在上面这段代码中,定义了MyObject类,并创建了一个大小为1MB的byte数组。在main方法中,无限循环创建了5个MyObject对象。当Eden区域被填满时,会进行Minor GC操作,将活着的对象复制到Survivor区域。在经过多次GC之后,仍然存活的对象会被移动到老年代中。
老年代主要存放一些生命周期比较长的对象,一般情况下不需要进行太频繁的GC操作。当老年代内存不足时,会进行Full GC操作,这个会比Minor GC慢很多,甚至会引发应用程序的停顿。因此,我们需要合理地进行年轻代和老年代的内存分配,以及进行相应的优化,以提高应用程序的性能。