《深入JVM之GCRoots》
堆中几乎存放着Java世界中所有的对象实例,垃圾收集器在对堆回收之前,第一件事情就是要确定这些对象哪些还“存活”着,哪些对象已经“死去”(即不可能再被任何途径使用的对象)
1.引用计数算法
很多教科书判断对象是否存活的算法是这样的:给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值加1;当引用失效时,计数器减1;任何时刻计数器都为0的对象就是不可能再...
分类:
其他好文 时间:
2016-05-12 12:22:30
阅读次数:
357
-server: 启用-server时新生代默认采用并行收集,其他情况下,默认不启用。-server策略为:新生代使用并行清除,年老代使用单线程Mark-Sweep-Compact的垃圾收集器。 -XX:+UseConcMarkSweepGC: 设置年老代为并发收集。 -XX:+UseAdaptiv ...
分类:
其他好文 时间:
2016-05-08 11:37:15
阅读次数:
118
如果说垃圾收集算法是内存回收的方法论,垃圾收集器就是内存回收的具体实现。Java虚拟机规范中对垃圾收集器应该如何实现没有任何规定,因此不同厂商,不同版本的虚拟机所提供的垃圾收集器都可能会有很大的差别,并且一般都会提供参数供用户根据自己的应用特定和要求进行组合出各个年代所使用的收集器。这里所讨论的收集器是基于Sun HotSpot虚拟机1.6版Update22,这个虚拟机所包含的收集器如下所示:...
分类:
其他好文 时间:
2016-05-07 10:52:29
阅读次数:
153
今天我们将一起学习Java虚拟机使用垃圾收集算法和常见的垃圾收集器。Java虚拟机内存区域的程序计数器、虚拟机栈和本地方法栈3个区域是随线程而生,随线程而灭;栈中的栈帧随着方法的进入和退出出栈和入栈。每一个栈帧中分配多少内存基本上是在类结构确定下来的时候就已知的,因此这个几个区域的内存分配和回收都具备确定性,在这几个区域就不需要过多考虑回收问题,因为方法结束或者线程结束时,内存自然就跟着回收了。而...
分类:
编程语言 时间:
2016-05-07 10:21:51
阅读次数:
328
垃圾收集算法主要有以下几种:标记-清除算法(mark-sweep)、复制算法(copying)和标记-整理算法(mark-compact)。标记-清除算法算法的执行过程与名字一样,先标记所有需要回收的对象,在标记完成后统一回收所有被标记的对象。该算法有两个问题:
标记和清除过程效率不高。主要由于垃圾收集器需要从GC Roots根对象中遍历所有可达的对象,并给这些对象加上一个标记,表明此对象在清除的时...
分类:
编程语言 时间:
2016-05-06 15:11:56
阅读次数:
190
相关概念并发和并行这两个名词都是并发编程中的概念,在谈论垃圾收集器的上下文语境中,它们可以解释如下。
并行(Parallel):指多条垃圾收集线程并行工作,但此时用户线程仍然处于等待状态。
并发(Concurrent):指用户线程与垃圾收集线程同时执行(但不一定是并行的,可能会交替执行),用户程序在继续运行,而垃圾收集程序运行于另一个CPU上。
Minor GC 和 Full GC
新生代GC(Mi...
分类:
其他好文 时间:
2016-05-06 15:09:20
阅读次数:
165
Java技术体系中所提倡的自动内存管理最终可以归结为自动化地解决了两个问题:给对象分配内存以及回收分配给对象的内存。对象的内存分配,往大方向讲,就是在堆上分配,对象主要分配在新生代的Eden区上,如果启动了本地线程分配缓冲,将按线程优先在TLAB上分配。少数情况下也可能会直接分配在老年代中,分配的规则并不是百分之百固定的,其细节取决于当前使用的是哪一种垃圾收集器组合,还有虚拟机中与内存相关的参数的设...
分类:
其他好文 时间:
2016-05-06 14:59:44
阅读次数:
132
引入
上篇博客《JVM——简介》中主要介绍了JVM的内存模型,思考一下:
为什么要划分堆、栈、方法区等?
为什么把不同种类的数据信息分别存放?
答案可以分为很多很多条,这里就说一个方面,如果我们是如何区分数据的种类的,那就是作用域。比如:堆、方法区是线程共享的,而栈是私有的。
那么管理又包括哪些方面呢?包括创建、存储、回收?这篇博客就来谈谈垃圾回收(Garbage Collectio...
分类:
编程语言 时间:
2016-05-06 14:55:31
阅读次数:
260
G1垃圾收集器是Jdk7的新特性之一、Jdk7+版本都可以自主配置G1作为JVMGC选项;作为JVMGC算法的一次重大升级、JDK7u后G1已相对稳定、且未来计划替代CMS、所以有必要深入了解下:不同于其他的分代回收算法、G1将堆空间划分成了互相独立的区块。每块区域既有可能属于O区、也有可能..
分类:
其他好文 时间:
2016-05-04 19:21:17
阅读次数:
311
前言 数据库是大家会普遍重视的一个领域,异步通信一般用不到,虚拟机在大部分时候不会出问题,常被人忽视,所以我打算先学习虚拟机,从零单排Java高性能问题。 堆内存存储结构 Java6是以年代来规划内存的,而Java7的G1收集器则相反,这里以Java6为准。 Survivor1和Survivor2是 ...
分类:
其他好文 时间:
2016-05-03 23:43:22
阅读次数:
318