跳转到内容
主菜单
主菜单
移至侧栏
隐藏
规范/协议
协议
算法
JVM
多线程/并发
存储
AI
深度学习
工具箱
最近更改
文章分类
全部文章
WHY42
搜索
搜索
外观
登录
个人工具
登录
欢迎来到Riguz的小站!这是一个私人wiki,用来记录一些我的笔记。
查看“︁JVM GC summary”︁的源代码
页面
讨论
大陆简体
阅读
查看源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
查看源代码
查看历史
常规
链入页面
相关更改
页面信息
外观
移至侧栏
隐藏
←
JVM GC summary
因为以下原因,您没有权限编辑该页面:
您请求的操作仅限属于该用户组的用户执行:
用户
您可以查看和复制此页面的源代码。
[[File:Hotspot-Arch.png|600px|HotSpot JVM architecture]] = JVM Generations= [[File:Hotspot-heap.png|600px|Hotspot Heap Structure]] Java的堆被划分成不同的区域: * young generation:存放新创建的对象,当这个区域占满的时候,会触发<span class="article-label">minor GC</span>,这时候存活的对象会被标记年龄,最终会移动到<span class="article-label">old generation</span>。 * old generation:存放存活的比较久的对象。当<span class="article-label">yound generation</span>存活的对象年龄到达设置的阈值后,就会被移动到这里来。当这个区域满了的时候,会触发<span class="article-label">major GC</span>。 * permanent generation:存放一些JVM运行所需的元数据,例如类的信息等。<span class="article-label">full GC</span>的时候也包括对这个区域的GC。 其中,<span class="article-label">minor GC</span>和<span class="article-label">major GC</span>都是<span class="article-label">Stop the World</span>的,即当GC触发的时候,所有的程序线程都会停止等待GC完成。通常<span class="article-label">minor GC</span>会比<span class="article-label">major GC</span>快很多,因为<span class="article-label">major GC</span>会遍历所有的存活对象。 其中,<span class="article-label">yound generation</span> 又被划分成<span class="article-label">Eden space</span>, <span class="article-label">Survivor Space1</span>, <span class="article-label">Survivor Space2</span>,其中<span class="article-label">Eden Space</span>占了绝大部分的空间。当<span class="article-label">Eden space</span>满的时候,GC 会将存活对象移动到其中一个<span class="article-label">Survivor Space</span>中,两个<span class="article-label">Survivor Space</span>是为了避免内存碎片,每次将存活的对象(Eden Space以及上一个Survivor Space)移动到另一个Survivor Space中。 [[File:Hotspot-Aging.png|600px|Mnior GC]] 通过<span class="article-label">Java VisualVM</span>和VisualGC插件可以很直观的看到GC的过程: [[File:visualVM_GC.png|600px|Visual GC]] <syntaxhighlight lang="bash"> java -Xmx50m \ -XX:-PrintGC \ -XX:+PrintHeapAtGC \ -XX:MaxTenuringThreshold=10 \ -XX:+UseConcMarkSweepGC \ -XX:+UseParNewGC TestGC </syntaxhighlight> = Garbage Collectors= <pre> Argument Description --------------- --------------------------------------------------------- -Xms Sets the initial heap size for when the JVM starts. -Xmx Sets the maximum heap size. -Xmn Sets the size of the Young Generation. -XX:PermSize Sets the starting size of the Permanent Generation. -XX:MaxPermSize Sets the maximum size of the Permanent Generation </pre> ;Serial GC:使用mark-compact算法进行GC,单线程的进行GC,适合单核CPU和在客户端允许的Java程序。 ;Parallel GC(throughput collector):多线程进行GC ;Concurrent Mark Sweep (CMS) Collector: 在程序运行的时候并发的进行GC,以最大限度减少停止时间 ;G1(Garbage-First) Garbage Collector: CMS的替代品 其中存在并行(Parallel)和并发(Concurrent)的区别,并行是指垃圾收集器多个线程同时工作,但此时用户线程依然是停止等待的;而并发是指在用户线程工作的同时,垃圾收集器同时执行。 [[File:JVM-GC-Collectors.jpg|600px|Java collectors]] <pre> Garbage Collector Type Algorithm MultiThread ----------------- -------------- ------------------------ ---------------------- Serial stop-the-world copying No ParNew stop-the-world copying Yes Parallel Scavenge stop-the-world copying Yes Serial Old stop-the-world mark-sweep-compact No CMS low-pause concurrent-mark-sweep Yes Parallel Old stop-the-world mark-sweep-compact Yes G1 compacting Yes </pre> <pre> Arguments Result ------------------------ -------------------------------------------------------- -XX:+UseSerialGC Serial + Serial Old -XX:+UseParNewGC ParNew + Serial Old -XX:+UseConcMarkSweepGC ParNew + CMS + Serial Old^["CMS" is used most of the time to collect the tenured generation. "Serial Old" is used when a concurrent mode failure occurs.] -XX:+UseParallelGC Parallel Scavenge + Serial Old -XX:+UseParallelOldGC Parallel Scavenge + Parallel Old –XX:+UseG1GC G1 </pre> = GC过程= == CMS== CMS 收集器的步骤: <pre> Phase Description ------------------------ ------------------------------------------------------- Initial Mark (Stop-Word) 标记老年代中的对象是否可达(reachable),包括可以从新生代中到达的 Concurrent Marking Remark (Stop-Word) Concurrent Sweep Resetting </pre> G1将Heap划分成一些相同大小的区块,但是没有限制不同代的大小。 [[File:JVM-GC-G1.png|600px|G1 Heap Allocation]] = 其他= 当对象被GC(之前)的时候,如果没有执行<span class="article-label">finalize</span>方法,是会执行一次finalize的。如果在finalize方法里面又被强引用了,那么会阻止对象被GC。!! References: * [http://enos.itcollege.ee/~jpoial/allalaadimised/reading/Advanced-java.pdf Advanced Java] * [https://codeahoy.com/2017/08/06/basics-of-java-garbage-collection/ Basics of Java Garbage Collection] * [https://www.novatec-gmbh.de/en/blog/g1-action-better-cms/ G1 in Action: Is it better than the CMS?] * [https://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html Java Garbage Collection Basics] * [https://www.oracle.com/webfolder/technetwork/tutorials/obe/java/G1GettingStarted/index.html Getting Started with the G1 Garbage Collector] [[Category:JVM]]
返回
JVM GC summary
。
搜索
搜索
查看“︁JVM GC summary”︁的源代码
添加话题