JVM虚拟机:堆结构的逻辑分区

堆内存的逻辑分区

堆内存的逻辑分区如下所示:JVM虚拟机:堆结构的逻辑分区_第1张图片

堆内存中分为新生代和老年代,二者空间大小1:3。在新生代里面分为两类区域(eden、survivor),三个区域(eden、survivor、survivor),三个区大小比例为8:1:1。

对象存放的位置

当我们new一个对象的时候,首先会将对象分配到栈上(线程私有小对象、无逃逸(方法外没有引用指向这个对象)、支持标量替换(类的成员变量就可以表示这个类)、无需调整),如果分配不了才会分配到eden区(对象大的时候就会分配不了,多少算大?有参数控制)。

新生代

在eden区有一个叫做线程本地分配TLAB的概念,因为多线程访问eden的时候需要保证安全,那么必然效率降低,此时我们可以让每个线程占用eden的1%的空间,然后对于每个线程来说,这个空间都是私有的,多线程的时候不用竞争就可以使用这个空间,可以提高效率。

还有一个动态年龄的概念,当年轻代进行垃圾回收的时候,假如是从eden+s0到s1的空间,如果此时eden+s0存活的对象超过了s1空间的一半,那么此时就会将一部分对象直接放到老年代。它会从年纪小的对象开始累加,当加入某个年龄段后,累加和超过survivor区域

你可能感兴趣的:(深入了解JVM虚拟机,jvm,java,算法,虚拟机,垃圾回收)