[jjzhu学java]之深入理解JVM之垃圾收集器与内存分配策略

  • 时间:
  • 浏览:1
  • 来源:万人牛牛棋牌_万人牛牛棋牌官网

现在一般的垃圾派发器全部都是用该算法(GC Root Tracing)来判断对象是与非 “消亡”,该算法的基本思想否则:通过一组称为“GC Roots”的对象作为根节点,否则从哪几个根节点向下搜索,搜索所走过的路径称为引用链(Reference Chain),当另一个多多对象到根节点之间如此任何二根引用链的话,就认为该对象否则“消亡”,如下图所示:

1、GC日志的第一行[GC [PSYoungGen说明了在新生代位于了GC(Minor GC),这里也都可不上能 看出,当前的HotSpot虚拟机采用的是Parallel Scavenge(PS)垃圾派发器 上方的4340K->256K代表GC前后的新生代内存区域的变化,这里从4340K变到256K,说明虚拟机进行了垃圾回收,上方的(5952K)代表新生代的内存区域大小,4340K->256K(19648K)这里的括号内的19648K代表新生代和年老代的内存大小。已经 的0.0009373 secs代表的是GC所用的事件。

2、GC日志的第二行[Full GC (System)表示系统触发的一次Full GC,全部都是之前 代码中System.gc();所引起的GC,一次Full GC会对java堆中的所有区域进行GC(新生代、年老代、永久代),所之上方的PSYoungGen(新生代)、PSOldGen(年老代)、PSPermGen(永久带)显示了各区域的GC情況,朋友都可不上能 都看PSYoungGen: 256K->0K(5952K),新生代经过Full GC后,全被清空了。

3、上方的Heap堆显示了各区域的最终使用情況

从最后的Full GC (System) [PSYoungGen: 256K->0K(5952K)]都可不上能 都看,新生代中的内存全被GC了,很多很多说,HotSpot并如此用引用计数算法来对“消亡”对象进行GC。

在分析结果前,先对GC的内容先做另一个多多介绍:

java中对象的创建时要的内存全部都是在java堆中申请的,很多很多垃圾派发的区域否则对java堆和方法区的内存区域进行GC。

引用计数(Reference Counting)算法的基本思想否则:给每个对象换成另一个多多引用计数器,每当另一个多多多地方对该对象进行了引用,引用计数器就加1;引用失效后就减1;当引用计数器为0时,就表示如此任何地方引用了该对象,这都可不上能 认为该对象否则“消亡”了。

嘴笨 引用计数算法思想简单,传输时延也很高,否则java虚拟机并如此用到该算法标记“消亡”对象,否则当总出 循环引用的已经 ,表现就全部都是如此好了。朋友都可不上能 编写测试代码测试并看GC信息看看java虚拟机到底有如此用该算法。

代码示例中,新建了另一个多多对象objA,objB,否则通过objA.instance = objB,objB.instance = objA让朋友互相引用,否则将objA、objB都置为空,否则触发GC,朋友都可不上能 通过-XX:+PrintGCDetails让java虚拟机在位于GC后打印出GC的具体信息,

代码片运行时的VM参数为-Xmx20M -Xms20M -XX:+PrintGCDetails

运行程序,可都看如下打印结果:

都可不上能 作为GC Roots的对象包括:

1. 虚拟机栈(栈帧中的本地变量表)中的引用的对象

2. 方法区中 的类静态属性引用的对象

3. 方法区中的常量引用的对象

4. Native方法引用的对象

任何判断对象是与非 消亡全部都是通过引用来判断,引用已经 的定义是:否则reference类型的数据中存储的数值代表的是另一块内存区域的起始地址的话,就称这块内存代表另一个多多引用

垃圾派发器的主要任务否则找出否则“消亡”的对象,将其标记并清除其说用内存的过程,怎么才能 才能 判断某个对象否则“消亡”,不同的虚拟机有不同的判断策略