1
0
mirror of https://github.com/Snailclimb/JavaGuide synced 2025-06-16 18:10:13 +08:00

修改一个错别字

212行 对象投 -> 对象头
This commit is contained in:
Konjacor 2023-01-15 14:08:47 +08:00 committed by GitHub
parent 48eab7d0ba
commit 5d1b0f0e05
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -209,7 +209,7 @@ JVM内存会划分为堆内存和非堆内存堆内存中也会划分为**年
当我们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从而避免响应超时的问题。
当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从而避免响应超时的问题。
而且当老年区执行了full gc之后仍然无法进行对象保存的操作就会产生OOM这时候就是虚拟机中的堆内存不足原因可能会是堆内存设置的大小过小这个可以通过参数-Xms、-Xmx来调整。也可能是代码中创建的对象大且多而且它们一直在被引用从而长时间垃圾收集无法收集它们。