书上关于GCTimeRatio的讲解有点难以理解,查看Oracle的文档后重新理解了下 -XX:GCTimeRatio 运行时间 / GC时间 当GCTimeRatio为19时,运行时间是GC时间的19倍,也就是GC时间不能超过 1 / (1 + 19) = 0.05 附上Oracle的文档原文 -XX:GCTimeRatio=nnn A hint to the virtual machine that it's desirable that not more than 1 / (1 + nnn…
垃圾收集 垃圾收集(Garbage Collection,GC),垃圾收集需要完成的三件事情. 哪些对象需要回收 什么时候回收 如何回收 如何确定对象已死(即不可能在被任何途径引用的对象) 引用计数算法 给每一个对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加一:当引用失效时,计数器值就减一:计数器值为0的对象就是表示没有在被使用的. 引用计数算法的实现简单,判定效率也比较高,大部分情况下都是一个不错的算法. Java语言中没有采用该算法来管理内存,最主要的原因是该算法没法解决对象…
垃圾收集器 判断对象是否需存活 回收堆 判断对象是否存活: 方法一:引用计数法.对象被引用一次就+1,当为0时回收对象.缺点:无法解决循环引用问题. 方法二:可达性分析算法.记录当前对象是否有和GC Roots中对象的引用链.(其中,可以作为GCRoots对象的有:虚拟机栈中引用的对象.方法去中类静态属性引用的对象.方法区中常量引用的对象.本地方法栈中引用的对象.) 不可达对象并不是一定被垃圾收集的,当这个对象有必要执行finalize()并finalize里自己和某个对象建立关联,即可在第二次…
GC可谓是java相较于C++语言,最大的不同点之一. 1.GC回收什么? 上一篇讲了内存的分布. 其中程序计数器栈,虚拟机栈,本地方法栈 3个区域随着线程而生,随着线程而死.这些栈的内存,可以理解为在编译期已经确定. 方法结束,或者线程结束时,内存就自然被回收了. 一个interface的多个实现类,需要的内存可能不一样,一个方法的多个分支需要的内存也不一样,我们只有在程序运行的时候,才知道会创建那些对象,需要多少内存. 这部分分配和回收都是动态的,GC所关注的就是这部分内存. 2.回收的标准…
在堆里存放着java世界中几乎所有的对象实例,垃圾收集器在对堆进行回收前需要知道哪些对象还存活,哪些对象已经死去.那怎么样去判断对象是否存活呢? 一.判断对象是否存活算法 1.引用计数法 实现思路:给对象添加一个引用计数器.每当有一个地方引用它时,计数器加1:引用失效时计数器减1.在任何时刻计数器为0的对象就是不可能再被使用的. 优点:实现简单,效率高. 缺点:很难解决对象之间的相互循环引用. 2.可达性分析算法 实现思路:通过GC Roots的对象作为起始点,从这些节点向下搜索,搜索走过的路径…
第三章 垃圾收集器与内存分配策略 3.1 概述 哪些内存需要回收 何时回收 如何回收 程序计数器.虚拟机栈.本地方法栈3个区域随线程而生灭. java堆和方法区的内存需要回收.   3.2 对象已死吗   什么时候回收内存?   3.2.1 引用计数法 给对象中添加一个引用计数器,有地方引用时,计数器加1:当引用失效时,计数器减1.任何时刻计数器为0时的对象就是不可能再被使用的了. 存在问题:对象间的循环引用.  虚拟机不是通过这种方法判断对象是否存活.   3.2.2 可达性分析算法 通过一系…
JVM学习笔记-第三章-垃圾收集器与内存分配策略 tips:对于3.4之前的章节可见博客:https://blog.csdn.net/sanhewuyang/article/details/95380620 3.5 经典垃圾收集器 3.5.1 Serial收集器 这个收集器是一个单线程工作的收集器,但它的单线程的意义并不仅仅是说明他只会使用一个处理器或一条收集线程去完成垃圾收集工作,更重要对的是强调在它进行垃圾收集时,必须暂停其他所有工作线程,直到它收集结束. 目前已经老无可用,但有着优于其他收…
垃圾收集器与内存分配策略 由于JVM中对象的频繁操作是在堆中,所以主要回收的是堆内存,方法区中的回收也有,但是比较谨慎 一.对象死亡判断方法 1.引用计数法 就是如果对象被引用一次,就给计数器+1,否则-1 实现简单,但是无法解决对象相互引用的问题:实际上JVM也不是使用的此种方式,因此已下的程序我们会看到内存被回收了 /** *testGC()方法执行后,objA和objB会不会被GC呢? *@author zzm */ class ReferenceCountingGC{ public Ob…
要实现虚拟机,其实人们主要考虑完成三件事情: 第一,哪些内存需要回收: 第二,什么时候回收: 第三,如何回收. 第二节,对象已死吗    垃圾收集其实主要是针对java堆里面的数据来说的,传统的垃圾收集方法主要是基于引用计数算法,比如windows里面的com或者是actionscript3里面的flash player,以及python语言,但是引用计数算法无法解决对象之间互相影响的问题.所以Java语言没有选用这种方式.    现在主流的商用语言,比如java,c#,都是采用可达性分析的算法…
1.1   垃圾收集器 垃圾收集器是内存回收的具体实现.以下讨论的收集器是基于JDK1.7Update14之后的HotSpot虚拟机.这个虚拟机包含的所有收集器有: 上图展示了7种作用于不同分代的收集器,如果两个收集器之间存在连线,就说明它们可以搭配使用.虚拟机所处的区域,则表示它是属于新生代收集器还是老年代收集器.接下来笔者将逐一介绍这些收集器的特性.基本原理和使用场景,并重点分析CMS和G1这两款相对复杂的收集器,了解它们的部分运作细节. 直到现在为止还没有最好的收集器出现,更加没有万能的收…