Java与C++之间有一堵由内存动态分配和垃圾回收技术所围成的"高墙",墙外的人想进去,墙外的人想出来.--<深入理解Java虚拟机> 前言 上一章看了高墙的一半,接下来看另一半--GC. 为什么需要GC和内存分配策略?当需要排查各种内存溢出.内存泄漏问题时,当垃圾回收成为系统达到更高并发量的瓶颈时,我们就需要对这些"自动化"的技术实施必要的控制和调节. 程序计数器.虚拟机栈.本地方法栈生命周期时伴随着线程的,所以更多的需要考虑Java堆和方法区的垃圾回…
GC可谓是java相较于C++语言,最大的不同点之一. 1.GC回收什么? 上一篇讲了内存的分布. 其中程序计数器栈,虚拟机栈,本地方法栈 3个区域随着线程而生,随着线程而死.这些栈的内存,可以理解为在编译期已经确定. 方法结束,或者线程结束时,内存就自然被回收了. 一个interface的多个实现类,需要的内存可能不一样,一个方法的多个分支需要的内存也不一样,我们只有在程序运行的时候,才知道会创建那些对象,需要多少内存. 这部分分配和回收都是动态的,GC所关注的就是这部分内存. 2.回收的标准…
垃圾收集器与内存分配策略 由于JVM中对象的频繁操作是在堆中,所以主要回收的是堆内存,方法区中的回收也有,但是比较谨慎 一.对象死亡判断方法 1.引用计数法 就是如果对象被引用一次,就给计数器+1,否则-1 实现简单,但是无法解决对象相互引用的问题:实际上JVM也不是使用的此种方式,因此已下的程序我们会看到内存被回收了 /** *testGC()方法执行后,objA和objB会不会被GC呢? *@author zzm */ class ReferenceCountingGC{ public Ob…
垃圾收集器与内存分配策略 前言:本文基于<深入java虚拟机>再加上个人的理解以及其他相关资料,对内容进行整理浓缩总结.本文中的图来自网络,感谢图的作者.如果有不正确的地方,欢迎指出. 目录 jvm系列(一):jvm内存区域与溢出 jvm系列(二):垃圾收集器与内存分配策略 回顾 上文介绍了jvm的内存区域以及介绍了内存的溢出情况. jvm区域分为5个,线程独有:虚拟机栈,本地方法栈,程序计数器.线程共享:方法区,堆 两种溢出:栈溢出(StackOverflowError),OutOfMemo…
垃圾收集 垃圾收集(Garbage Collection,GC),垃圾收集需要完成的三件事情. 哪些对象需要回收 什么时候回收 如何回收 如何确定对象已死(即不可能在被任何途径引用的对象) 引用计数算法 给每一个对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加一:当引用失效时,计数器值就减一:计数器值为0的对象就是表示没有在被使用的. 引用计数算法的实现简单,判定效率也比较高,大部分情况下都是一个不错的算法. Java语言中没有采用该算法来管理内存,最主要的原因是该算法没法解决对象…
1.判断对象是否存活的算法: 1.1.引用计数算法:给对象添加一个引用计数器,每当有一个地方引用他时,计数器+1,当引用失效时,计数器-1,任何时刻计数器为0的对象就是不可能再被引用的,但是他很难解决对象之间相互循环引用的问题 1.2.可达性分析算法:该算法在主流的语言中被大量使用,该算法是通过一系列的被称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径被称为引用链,当一个对象到GC Roots没有任何 引用链相连,则证明此对象不可用 2.java语言中的GC R…
垃圾收集器需要完成的3件事情: 哪些内存需要回收? 什么时候回收? 如何回收? 在前一节中介绍了java内存运行时区域的各个部分,其中程序计数器.虚拟机栈.本地方法栈3个区域随线程而生,随线程而灭:栈中的栈帧随着方法的进入和退出而有条不紊地执行着出栈和入栈操作.每一个帧栈中分配多少内存基本上是在类结构确定下来时已经确定下来时及已知,因此这几个区域的内存分配和回收都具备确定性,不需要过多考虑回收问题,因为方法结束或者线程结束时,内存自然就跟着随着回收.而java堆和方法区则不一样,一个接口中的多个…
一.GC 第一步:判断对象是否已死?有两种方法:第一种是引用计数法,即给对象添加一个引用计数器,当被引用时,计数器就+1:当引用失效时,就-1:当计数器为0时,代表对象没有被引用.但是计数器的缺点就是:对象之间相互引用时导致计数器不为零,无法被回收.第二种方法是可达性分析法,即通过定义一系列的GC Roots对象作为起始点,从这些起点向下搜索,当一个对象到GC Roots没有任何引用链时,则此对象是不可用的. 可以作为GC Roots的对象包括:虚拟机栈中引用的对象.方法去种类静态属性或常量引用…
在堆里存放着java世界中几乎所有的对象实例,垃圾收集器在对堆进行回收前需要知道哪些对象还存活,哪些对象已经死去.那怎么样去判断对象是否存活呢? 一.判断对象是否存活算法 1.引用计数法 实现思路:给对象添加一个引用计数器.每当有一个地方引用它时,计数器加1:引用失效时计数器减1.在任何时刻计数器为0的对象就是不可能再被使用的. 优点:实现简单,效率高. 缺点:很难解决对象之间的相互循环引用. 2.可达性分析算法 实现思路:通过GC Roots的对象作为起始点,从这些节点向下搜索,搜索走过的路径…
书上关于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…