JVM(三)运行时内存

一、运行时内存

Java堆从GC的角度还可以细分为:新生代(Eden区、From Servivor区和To Servivor区)和老年代

 

 

二、新生代

用来存放新生的对象。一般占堆的1/3空间。由于频繁创建对象,所以新生代会频繁触发MinorGC(Minor,轻微的)进行垃圾回收。

新生代又分为Eden区、From Servivor区和To Servivor区。

 

2.1 Eden区

Java新对象的出生地(如果新创建的对象占用内存很大,则直接分配到老年代)。当Eden区内存不够的时候就会触发MinorGC,对新生代区进行一次垃圾回收。

 

2.2 From Servivor区

上一次GC的幸存者,作为这一次GC的被扫描者。

 

2.3 To Servivor区

保留了一次MinorGC过程中的幸存者。

 

2.4 MinorGC采用复制算法

1、Eden、From Servivor复制到To Servivor,年龄+1

首先,把Eden和From Servivor区域中存活的对象复制到To Servivor区域(如果有对象的年龄已经达到了老年的标准,则复制到老年代区),同时把这些对象的年龄+1(如果To Servivor不够位置了就放到老年区)。

2、清空Eden、From Servivor中的对象

3、To Servivor和From Servivor互换

原To Servivor成为下一次GC时的From Servivor。

 

 

三、老年代

主要存放应用程序中生命周期长的内存对象。

老年代的对象比较稳定,所以MajorGC(Major,主要的,重要的)不会频繁执行。在进行MajorGC前一般都先进行了一次MinorGC,使得有新生代的对象晋升入老年代,导致空间不够用时才触发。当无法找到足够大的连续空间分配给新创建的较大对象时也会提前触发一次MajorGC进行垃圾回收腾出空间。

MajorGC采用标记清除算法:首先扫描一次所有老年代,标记出存活的对象,然后回收没有标记的对象。MajorGC的耗时比较长,因为要扫描再回收。MajorGC会产生内存碎片,为了减少内存损耗,我们一般需要进行合并或者标记出来方便下次直接分配。当老年代也满了装不下的时候,就会抛出Out Of Memory异常。

 

 

四、永久代

指内存的永久保存区域,主要存放Class和Meta(元数据)的信息,Class在被加载的时候被放入永久区域,它和存放实例的区域不同,GC不会在主程序运行期对永久区域进行清理。所以这也导致了永久代的区域会随着加载的Class的增多而胀满,最终抛出Out Of Memory异常。

 

 

五、JAVA8与元数据

在Java8中,永久代已经被移除,被一个称为“元数据区”(元空间)的区域所取代。元空间的本质和永久代类似,元空间与永久代之间最大的区别在于:元空间并不在虚拟机中,而是使用本地内存。因此,默认情况下,元空间的大小仅受本地内存限制。类的元数据放入native memory,字符串池和类的静态变量放入java堆中,这样可以加载多少类的元数据就不再由MaxPermSize控制,而由系统的实际可用空间来控制。

 

元数据:描述数据及其环境的数据,比如,有一条学生信息记录,其中包括字段姓名(name)、年龄(age)、性别(male)、班级(class)等,那么name、age、male、class就是元数据。通过它们的描述,一条关于学生信息的数据记录就产生;

 

 

六、创建对象的过程

 

创建一个对象的时候,首先会尝试往栈里放,对象随着栈帧的弹出结束;如果栈放不下,根据对象的大小判断,如果大则放在老年代,对象随着MajorGC或FullGC结束;如果小则尝试放在线程局部缓存区域(Thread Local Allocation Buffer,当有多个线程要在eden区存放对象时涉及到同步问题,效率比较低;因此HotSpot为了提高效率,给每个线程分配一块独立的空间,在这个空间存放对象不需要加锁,效率高,TLAB仅作用在eden区,可以算做是在eden区);若TLAB放不下,则在eden区存放,经过GC后如果对象未存活则结束,若存活则年龄加1看年龄是否到达老年,是则放到老年代,不是则放在s1区,下次GC再次判断年龄,年龄没到达则放到s2区,如此在s1、s2反复存放,直到到达老年年龄。

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值