好程序员官网-从平凡到卓越,为梦想而拼搏-好程序员特训营

标题: 好程序员java培训教程分享jvm篇 [打印本页]

作者: 叶子老师    时间: 2019-6-11 15:38
标题: 好程序员java培训教程分享jvm篇
好程序员java培训教程分享jvm篇,在前面的文章中,介绍了JVM内存模型分为:堆区、虚拟机栈、方法区、本地方法区和程序计数器,其中堆区是JVM中最大的一块内存区域,在Java中的所有对象实例都保存在此区域,它能被所有线程共享。
Java中还有一个重要的机制:GC(垃圾收集器),堆是GC管理的主要区域,本文会带大家了解GC机制。
GC简介
GCGarbage Collection)垃圾收集机制是Java一个重要特性。不同于C/C++语言需要程序员自己管理内存的回收,而且这样做往往容易出错,导致内存泄漏等严重问题。
Java程序员不用编写回收内存的代码,因为JavaGC机制,它是一个特殊的后台线程,该线程对JVM中的内存进行标记,并确定哪些需要回收,再通过一定的回收策略自动回收内存,它在后台一直运行,保证JVM不会出现内存溢出的问题。
对象回收的算法
那么GC是如何判断某个对象的内存需要回收呢?GC需要判断该对象已死,也就是不再被调用,如何判断对象不再被调用呢?
这里有两种算法:
1、引用计数算法
2、可达性分析算法
引用计数算法
该算法给每个对象分配一个计器,当有引用指向这个对象时,计数器加1,当指向该对象的引用失效时,计数器减一。最后如果该对象的计器为0时,java垃圾回收器会认为该对象是可回收的。
优点:
1、实时性高,只要对象计数器为0就进行回收,不用等到内存不足的时候。
2在垃圾回收过程中,应用无需挂起。
3、更新对象的计数器时,只是影响到该对象,不会扫描全部对象。
缺点:
1、每次引用对象时,都会更新计数器,有时间消耗
2、不能解决循环引用问题
那什么是循环引用问题呢?我们看下面这段代码:
1. class ClassA{  
2.   ClassB b;  
3. }  
4. class ClassB{  
5.   ClassA a;  
6. }  
7. public static void main(String[] args){  
8.   ClassA a = new ClassA();  
9.   ClassB b = new ClassB();  
10.   a.b = b;  
11.   b.a = a;  
12.   a = null;  
13.   b = null;  
14. }  
上面的ab两个对象虽然都赋值为null,但是都不能回收,因为存在循环引用,它们的计数器不为0.
可达性分析算法
该算法通过一种被称作GC Root”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连时,则证明此对象时不可用的。
如下图:
(, 下载次数: 97)