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

  • 时间:
  • 浏览:2
  • 来源:uu快3官网_uu快3登入

java中对象的创建都要的内存都能否 在java堆中申请的,什么都垃圾埋点的区域而是对java堆和法律土法子区的内存区域进行GC。

垃圾埋点器的主要任务而是找出将会“消亡”的对象,将其标记并清除其说用内存的过程,何如判断某个对象将会“消亡”,不同的虚拟机有不同的判断策略

任何判断对象是是否消亡都能否 通过引用来判断,引用之前 的定义是:将会reference类型的数据中存储的数值代表的是另一块内存区域的起始地址语录,就称这块内存代表从前引用

代码示例中,新建了从前对象objA,objB,什么都通过objA.instance = objB,objB.instance = objA让什么都人互相引用,什么都将objA、objB都置为空,将会触发GC,什么都人儿都都要通过-XX:+PrintGCDetails让java虚拟机在处于GC后打印出GC的具体信息,

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

运行守护任务管理器,可都看如下打印结果:

引用计数(Reference Counting)算法的基本思想而是:给每个对象上加从前引用计数器,每当有从前地方对该对象进行了引用,引用计数器就加1;引用失效后就减1;当引用计数器为0时,就表示那么任何地方引用了该对象,这都都要认为该对象将会“消亡”了。

真是 引用计数算法思想简单,传输效率也很高,什么都java虚拟机并那么用到该算法标记“消亡”对象,将会当老出循环引用的之前 ,表现就都能否 那么好了。什么都人儿都都要编写测试代码测试并看GC信息看看java虚拟机到底有那么用该算法。

现在一般的垃圾埋点器都能否 用该算法(GC Root Tracing)来判断对象是是否“消亡”,该算法的基本思想而是:通过一组称为“GC Roots”的对象作为根节点,什么都从哪几个根节点向下搜索,搜索所走过的路径称为引用链(Reference Chain),当从前对象到根节点之间那么任何二根引用链语录,就认为该对象将会“消亡”,如下图所示:

都都要作为GC Roots的对象包括:

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

2. 法律土法子区中 的类静态属性引用的对象

3. 法律土法子区中的常量引用的对象

4. Native法律土法子引用的对象

在分析结果前,先对GC的内容先做从前介绍:

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。