1
0
mirror of https://github.com/Snailclimb/JavaGuide synced 2025-08-14 05:21:42 +08:00

Compare commits

..

No commits in common. "c50f8bd45c41af35420879ddd7deca2131a72fcb" and "b5ac378fd894525d1a413a7c57ab7310f8622055" have entirely different histories.

View File

@ -207,7 +207,7 @@ JVM内存会划分为堆内存和非堆内存堆内存中也会划分为**年
#### 3.3.7 Eden年轻代的介绍
当我们new一个对象后会先放到Eden划分出来的一块作为存储空间的内存但是我们知道对堆内存是线程共享的所以有可能会出现两个对象共用一个内存的情况。这里JVM的处理是每个线程都预先申请好一块连续的内存空间并规定了对象存放的位置而如果空间不足会再申请多块内存空间。这个操作我们会称作TLAB有兴趣可以了解一下。
当我们new一个对象后会先放到Eden划分出来的一块作为存储空间的内存但是我们知道对堆内存是线程共享的所以有可能会出现两个对象共用一个内存的情况。这里JVM的处理是每个线程都预先申请好一块连续的内存空间并规定了对象存放的位置而如果空间不足会再申请多块内存空间。这个操作我们会称作TLAB有兴趣可以了解一下。
当Eden空间满了之后会触发一个叫做Minor GC就是一个发生在年轻代的GC的操作存活下来的对象移动到Survivor0区。Survivor0区满后触发 Minor GC就会将存活对象移动到Survivor1区此时还会把from和to两个指针交换这样保证了一段时间内总有一个survivor区为空且to所指向的survivor区为空。经过多次的 Minor GC后仍然存活的对象**这里的存活判断是15次对应到虚拟机参数为 -XX:MaxTenuringThreshold 。为什么是15因为HotSpot会在对象投中的标记字段里记录年龄分配到的空间仅有4位所以最多只能记录到15**会移动到老年代。老年代是存储长期存活的对象的占满时就会触发我们最常听说的Full GC期间会停止所有线程等待GC的完成。所以对于响应要求高的应用应该尽量去减少发生Full GC从而避免响应超时的问题。