GC可谓是java相较于C++语言,最大的不同点之一. 1.GC回收什么? 上一篇讲了内存的分布. 其中程序计数器栈,虚拟机栈,本地方法栈 3个区域随着线程而生,随着线程而死.这些栈的内存,可以理解为在编译期已经确定. 方法结束,或者线程结束时,内存就自然被回收了. 一个interface的多个实现类,需要的内存可能不一样,一个方法的多个分支需要的内存也不一样,我们只有在程序运行的时候,才知道会创建那些对象,需要多少内存. 这部分分配和回收都是动态的,GC所关注的就是这部分内存. 2.回收的标准…
书上关于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…
垃圾收集器与内存分配策略 由于JVM中对象的频繁操作是在堆中,所以主要回收的是堆内存,方法区中的回收也有,但是比较谨慎 一.对象死亡判断方法 1.引用计数法 就是如果对象被引用一次,就给计数器+1,否则-1 实现简单,但是无法解决对象相互引用的问题:实际上JVM也不是使用的此种方式,因此已下的程序我们会看到内存被回收了 /** *testGC()方法执行后,objA和objB会不会被GC呢? *@author zzm */ class ReferenceCountingGC{ public Ob…
垃圾收集器 判断对象是否需存活 回收堆 判断对象是否存活: 方法一:引用计数法.对象被引用一次就+1,当为0时回收对象.缺点:无法解决循环引用问题. 方法二:可达性分析算法.记录当前对象是否有和GC Roots中对象的引用链.(其中,可以作为GCRoots对象的有:虚拟机栈中引用的对象.方法去中类静态属性引用的对象.方法区中常量引用的对象.本地方法栈中引用的对象.) 不可达对象并不是一定被垃圾收集的,当这个对象有必要执行finalize()并finalize里自己和某个对象建立关联,即可在第二次…
垃圾收集 垃圾收集(Garbage Collection,GC),垃圾收集需要完成的三件事情. 哪些对象需要回收 什么时候回收 如何回收 如何确定对象已死(即不可能在被任何途径引用的对象) 引用计数算法 给每一个对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加一:当引用失效时,计数器值就减一:计数器值为0的对象就是表示没有在被使用的. 引用计数算法的实现简单,判定效率也比较高,大部分情况下都是一个不错的算法. Java语言中没有采用该算法来管理内存,最主要的原因是该算法没法解决对象…
前言 该读书笔记用于记录在学习<深入理解Java虚拟机--JVM高级特性与最佳实践>一书中的一些重要知识点,对其中的部分内容进行归纳,或者是对其中不明白的地方做一些注释.主要是方便之后进行复习. 目录 <深入java虚拟机>读书笔记之Java内存区域 垃圾收集器与内存分配策略 哪些内存需要垃圾回收 在上一节中有提到在运行时数据区域包括:堆.虚拟机栈.本地方法栈.程序计数器.方法区(JDK1.7及之前).元空间(JDK1.8及之后).在这些区域中,程序计数器占用内存极小,可以忽略:栈…
垃圾收集器与内存分配策略 前言:本文基于<深入java虚拟机>再加上个人的理解以及其他相关资料,对内容进行整理浓缩总结.本文中的图来自网络,感谢图的作者.如果有不正确的地方,欢迎指出. 目录 jvm系列(一):jvm内存区域与溢出 jvm系列(二):垃圾收集器与内存分配策略 回顾 上文介绍了jvm的内存区域以及介绍了内存的溢出情况. jvm区域分为5个,线程独有:虚拟机栈,本地方法栈,程序计数器.线程共享:方法区,堆 两种溢出:栈溢出(StackOverflowError),OutOfMemo…
上周末搬家后,家里的宽带一直没弄好,跟电信客服反映了N遍了终于约了个师傅明天早上来迁移宽带,可以结束一个多星期没网的痛苦日子了.这段时间也是各种忙,都一个星期没更新博客了,再不写之前那种状态和激情都要慢慢褪去了,总觉得心里慌的一逼,这怎么行呢?!趁明天周末,在公司电脑上记录下这周的一些学习内容.近期在看一本很经典的java书籍:<深入理解java虚拟机 第二版>,几年前也翻过,但那时候功力不够,不太能看懂就没看了.现在回过头来看,发现确实写的很好,很多知识点都能理解了,而且讲的也很有深度,收获…
正文 垃圾收集器关注的是 Java 堆和方法区,因为这部分内存的分配和回收是动态的.只有在程序处于运行期间时才能知道会创建哪些对象,也才能知道需要多少内存. 虚拟机栈和本地方法栈则不需要过多考虑回收的问题,因为栈中每一个栈帧分配多少内存基本上是在类结构确定下来时就已知的,因此这几个区域的内存分配和回收具有确定性. 一.对象已死吗 垃圾收集器在对堆进行回收前,第一件事就是要确定堆中对象哪些还"存活"着,哪些已"死去"(即不可能再被任何途径使用的对象). 1. 引用计数…
收集器可以大致分为:单线程收集器, 并发收集器和并行收集器. 并行(Parallel):指多条垃圾收集线程并行工作,但此时用户线程仍然处于等待状态. 并发(Concurrent):指用户线程与垃圾收集线程同时执行(但不一定是并行的,可能会交替执行),用户程序在继续运行,而垃圾收集程序运行于另一个CPU上. 1. Serial 收集器 它是单线程收集器.“单线程”是指它在进行垃圾回收时,会暂停其它所有的线程,直至它收集结束.Serial 收集器对于运行在Client 模式下的虚拟机来说是一个很好的…