注:本文只是列出jvm内存中包含的知识点,具体理解还需另行查找。
垃圾收集需要完成的3件事情如下:
1)哪些内存需要回收?
java堆和方法区
2)什么时候回收?
垃圾收集器在对堆进行回收前,第一件事就是要确定这些对象之中哪些还存活着,哪些已经死去。判断的算法有以下几种:
①引用算法
在对象中添加一个引用计数器,每当一个地方引用它时,计数器值就加1,当引用失效时,计数器值就减1,任何时刻计数器为0的对象就是不可能再被使用的。
引用计数算法的实现简单,判定效率也很高,但它很难解决对象之间相互引用的问题,所以主流的Java迅疾里面没有选用引用计数算法来管理内存。
②可达性分析算法
在主流的商用程序语言都是称可达性分析来判定对象是否存活的,这个算法的基本思路的通过一系列的称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的。但真正宣布一个对象死亡,至少要经历两次标记过程:如果对象在分析中没有可达的引用链,则会被第一次标记并且进行筛选。如果对象由finalize()方法且未执行,则虚拟机会触发执行,若对象在此方法中重新与引用链上的任何一个对象关联上,则在第二次标记时便会被移除即将回收的集合。否则,就将真的回收。
如下图所示,object5、object6和object7就是不可用对象,会被判定为可回收对象。
在Java语言中,可作为GC Roots的对象包括下面几种:
直到现在为止还没有最好的收集器出现,也没有万能的收集器,使用时只考虑对具体应用最合适的收集器。
JDK命令行工具
jps:虚拟机进程状况工具
jstat:虚拟机统计信息监视工具
jinfo:Java配置信息工具
jmap:Java内存映像工具
jhat:虚拟机堆转储分析工具
jstack:Java堆栈跟踪工具
HSDIS:JIT生成代码反汇编
JDK的可视化工具
①JConsole:Java监视与管理控制台
JConsole是一种基于JMX的可视化监视、管理工具。它管理部分的功能是针对JMX MBean进行管理。
②VisUalVM:多合一故障处理工具
VisualVM是目前为止随JDK发布的功能最强大的运行监视和故障处理程序。VisualVM有一个很大的优点:不需要被监视的程序基于特殊Agent运行,因此它对应用程序的实际性能的影响很小,使得它可以直接应用再生产环境中。