程序在运行过程中需要创建大量的对象,这些对象都会被分配至Java的堆内存中。由于我们所创建的对象生命周期是不同的,所以Java堆被划分为两块区域新生代(Young)和老年代(Old)
(1)新生代 :创建后立马就可以回收的对象
(2)老年代: 创建之后需要长时间存放于内存中的对象
如下两个示例:
执行主线程main方法,每一秒会调用一次getUserInfo方法,都会生成一个帧栈压入虚拟机栈中,每次方法执行完成就会产生一个垃圾(User实例对象)。因为当方法调用完后就在也没有任何地方引用它了,这种没有引用的对象就会放在新生代。
将代码稍作调整,改为创建了一个User静态变量,这次每次执行完,User实例对象还会停留在堆上,由于该对象一直有引用指向,所以无法回收,长期存在就会被放置老年代
之所以需要将Java堆划分为新生代和老年代,主要是JVM针对不同的生命周期对象,采用了不同的垃圾回收算法,从而更有的利用空间,也提高性能
(3) 永久代
永久代是Hotspot虚拟机特有的概念,是方法区的一种实现,JDK1.8后,永久代被元空间(本地内存)替代了,