HeapDump性能社区专题系列三:过年七天,天天向上原创
作为Java开发者,一般不需要专门编写内存回收和垃圾清理代码,对内存泄露和溢出的问题,也不需要像C程序员那样战战兢兢。这是因为在Java虚拟机中,存在自动内存管理和垃圾清扫机制。概括地说,该机制对JVM(Java Virtual Machine)中的内存进行标记,并确定哪些内存需要回收,根据一定的回收策略,自动的回收内存,永不停息(Nerver Stop)的保证JVM中的内存空间,防止出现内存泄露和溢出问题。
Java GC机制主要完成3件事:确定哪些内存需要回收,确定什么时候需要执行GC,如何执行GC。经过这么长时间的发展(事实上,在Java语言出现之前,就有GC机制的存在,如Lisp语言),Java GC机制已经日臻完善,几乎可以自动的为我们做绝大多数的事情。然而,如果我们从事较大型的应用软件开发,曾经出现过内存优化的需求,就必定要研究Java GC机制。
本专题为大家收录了社区内的7篇优质文章,其中有超全的GC原理和调优技巧手册,有硬核的源码解析,还有深入详细的难点功课。
1.垃圾回收全集之十二:GC 调优的实战篇—Weak, Soft 及 Phantom 引用
作者:金色梦想
https://heapdump.cn/article/3243682
本文来自于plumbr官网,plumbr作为一个常用的JVM 监测工具,官网有完整的oom和gc文章,准备慢慢全部翻译过来:
第十篇:GC调优实战篇—高分配速率(High Allocation Rate)
第11篇:GC 调优的实战篇—过早提升(Premature Promotion)
第12篇:GC 调优的实战篇—Weak, Soft 及 Phantom 引用
2.JVM源码分析之SystemGC完全解读
作者:你假笨
https://heapdump.cn/article/154235
JVM的GC一般情况下是JVM本身根据一定的条件触发的,不过我们还是可以做一些人为的触发,比如通过jvmti做强制GC,通过System.gc触发,还可以通过jmap来触发等,针对每个场景其实我们都可以写篇文章来做一个介绍,本文重点介绍下System.gc的原理。
3.g1源码之YoungGC技术细节探究
作者:自成溪
https://heapdump.cn/article/2597586
笔者经过上次研究ZGC的代码之后,感受到了ZGC性能的提升和设计的巧妙,由此知道了ZGC的各种优势。但是现在日常生产中许多应用还是用的JAVA8和G1,作为一个对技术有追求的程序员,不由得产生了看一看G1源码的想法。笔者一直本着比较学习才能收获更多的原则,所以打开了java8的源码,开始学习G1,再学习过程中发现,G1的代码相较于zgc阅读起来稍微有些困难,花的时间更长一些。网上许多关于G1源码的文章并不是很全面,有些问题也没有讲清楚,笔者会尽量将源码的细节阐述清楚。
4.g1源码之Mixed GC与ConcurrentMark细节详解
作者:自成溪
https://heapdump.cn/article/2669369
继上次全面剖析了youngGC的源码后,这次笔者又阅读了关于Mixed GC的部分源码,相对于youngGC,Mixed GC部分更好阅读和理解一些(ps:不知道是不是因为已经有了读youngGC代码的基础),好了话不多说,我们直接来学代码。
5.g1源码之fullGC算法详解
作者:自成溪
https://heapdump.cn/article/2698720
关于g1的gc源码系列解析就剩下fullGC了,其实关于fullGC的源码方面并不是很难,相对于youngGC和mixed GC和并发标记来说,相对好阅读一些,网上也有一些文章是讲述fullGC的源码,但是多多少少有些部分讲述的不太清楚,或者干脆写错,所以笔者从自己的视角出发,来学习fullGC的源码,话不多说,我们直接开始。
6.JVM 源码解读之 CMS GC 触发条件
作者:涤生
https://heapdump.cn/article/190389
经常有同学会问,为啥我的应用 Old Gen 的使用占比没达到 CMSInitiatingOccupancyFraction 参数配置的阈值,就触发了 CMS GC,表示很莫名奇妙,不知道问题出在哪?
其实 CMS GC 的触发条件非常多,不只是 CMSInitiatingOccupancyFraction 阈值触发这么简单。本文通过源码全面梳理了触发 CMS GC 的条件,尽可能的帮你了解平时遇到的奇奇怪怪的 CMS GC 问题。
7.Java GC详解 - 最全面的理解Java对象结构 - 对象指针 OOPs
作者:张哈希
https://heapdump.cn/article/2278016
最近在抽时间阅读 JDK 的源码,主要是 GC 还有 Safepoint 相关的源码,发现很多我在之前拜读网上各种 JVM 原理大作时候的由于没有看源码导致我对于底层原理的误解。果然,一百个人读水浒传,就有一百种水浒传。还是需要更加深入的了解下源码,才能更好地理解 JVM,进行调优。这个系列,将在讲述 Java GC 各种原理的基础上,结合对应的源码分析,并附上源码地址。因为JVM的源码更新还是很快的,尤其是 GC 这一块,但是基本原理,应该大体不会变,附上源码地址,旨在让各位读者掌握这些原理最新实现情况。本文在撰写的时候,会紧跟最新版本的 JDK。
GC(Garbage Collection) 是目前很多编程语言自带的特性,例如Java,Python;GC是一个很好的特性,能让使用这个语言编程的程序员不去关心内存回收,并且降低内存泄漏和内存溢出发生的概率。
了解Java GC,需要先知道 Java 最基础的对象在内存中究竟是如何存储的。我们专注于 HotSpot 虚拟机实现,来详细阐述对象存储结构。首先我们来了解一个概念,对象指针(OOPs,Ordinary Object Pointers), 也就是对象头的主要部分。
学习Java GC机制,可以帮助我们在日常工作中排查各种内存溢出或泄露问题,解决性能瓶颈,达到更高的并发量,写出更高效的程序。HeapDump性能社区祝大家虎年虎虎生威,如虎添翼!
文末为大家送出一个小福利:
活动期间(2022.2.11-2022.2.28),在本文收录的7篇文章下的评论区中写下你的#阅读收获/延伸思考/学习感想#,即可获得HeapDump性能社区周边咖啡杯一个(颜色随机)~
要求:每篇文章都需留言,评论字数>30字且有意义,不能与其他评论重复,灌水评论将被视为无效哦~ 每位用户限领取一份奖品。
领奖方式:完成7篇文章评论打卡后请添加堆堆微信:PerfMa,提供你的评论截图+主页截图,运营小姐姐将会认真审核。符合要求的用户,奖品将在2022.3.4前寄出。