Grabage Collection      GC GC要完毕的三件事情: 哪些内存须要回收? 什么时候回收? 怎样回收? 内存运行时区域的各个部分中: 程序计数器.虚拟机栈.本地方法栈这3个区域随线程而生.随线程而灭. 栈中的栈帧随着方法的进入和退出而有条不紊地运行着出栈和入栈的操作. 每个栈帧中分配多少内存基本上是在类结构确定下来时就已知的,因此, 这几个区域的内存分配和回收都具备确定性,在这几个区域内就不需过多考虑回收的问题. 由于方法结束或者线程结束时.内存自然就跟着回收了. 而jav…
收集器可以大致分为:单线程收集器, 并发收集器和并行收集器. 并行(Parallel):指多条垃圾收集线程并行工作,但此时用户线程仍然处于等待状态. 并发(Concurrent):指用户线程与垃圾收集线程同时执行(但不一定是并行的,可能会交替执行),用户程序在继续运行,而垃圾收集程序运行于另一个CPU上. 1. Serial 收集器 它是单线程收集器.“单线程”是指它在进行垃圾回收时,会暂停其它所有的线程,直至它收集结束.Serial 收集器对于运行在Client 模式下的虚拟机来说是一个很好的…
1.1   垃圾收集器 垃圾收集器是内存回收的具体实现.以下讨论的收集器是基于JDK1.7Update14之后的HotSpot虚拟机.这个虚拟机包含的所有收集器有: 上图展示了7种作用于不同分代的收集器,如果两个收集器之间存在连线,就说明它们可以搭配使用.虚拟机所处的区域,则表示它是属于新生代收集器还是老年代收集器.接下来笔者将逐一介绍这些收集器的特性.基本原理和使用场景,并重点分析CMS和G1这两款相对复杂的收集器,了解它们的部分运作细节. 直到现在为止还没有最好的收集器出现,更加没有万能的收…
垃圾收集器 垃圾收集器是垃圾收集算法的具体实现.Java规范对垃圾收集器的实现没有做任何规定,因此不同的虚拟机提供的垃圾收集器可能有很大差异.HotSpot虚拟机1.7版本使用了多种收集器.如下图. 共有7种作用不不同分代的收集器,其中Serial.ParNew.Parallel Scavenge属于新生代收集器,CMS.Serial Old(MSC) Parallel Old属于老年代收集器,G1可以作用于这两部分.相互连线表示收集器可以搭配使用. Serial (串行)收集器 Serial收…
GC可谓是java相较于C++语言,最大的不同点之一. 1.GC回收什么? 上一篇讲了内存的分布. 其中程序计数器栈,虚拟机栈,本地方法栈 3个区域随着线程而生,随着线程而死.这些栈的内存,可以理解为在编译期已经确定. 方法结束,或者线程结束时,内存就自然被回收了. 一个interface的多个实现类,需要的内存可能不一样,一个方法的多个分支需要的内存也不一样,我们只有在程序运行的时候,才知道会创建那些对象,需要多少内存. 这部分分配和回收都是动态的,GC所关注的就是这部分内存. 2.回收的标准…
1. 标记 - 清除算法 先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象.它是最基础的收集算法.其他收集算法都是根据其思路,改进其不足之处. 缺点:1) 标记和清除两个阶段的效率都不高:2)清除后会产一大量不连续的内存碎片 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…
java之jvm学习笔记四(安全管理器) 前面已经简述了java的安全模型的两个组成部分(类装载器,class文件校验器),接下来学习的是java安全模型的另外一个重要组成部分安全管理器. 安全管理器是一个单独的对象,在java虚拟机中,它在访问控制-对于外部资源的访问控制-起到中枢作用 如果光看概念可能并不能很好的理解,或者说比较抽象,下面是ClassLoader其中的一个构造函数,先简单的看看它在初始化ClassLoader之前会做一些什么操作 protected ClassLoader(C…
虚拟机性能监控与故障处理工具 详解 4.1 概述 本文参考的是周志明的 <深入理解Java虚拟机> 第四章 ,为了整理思路,简单记录一下,方便后期查阅. JDK本身提供了很多方便的JVM性能调优监控工具,除了集成式的VisualVM和jConsole外,还有jps.jstack.jmap.jhat.jstat.hprof等小巧的工具,本文希望能起抛砖引玉之用,让大家能开始对JVM性能调优的常用工具有所了解. 4.2 JDK的命令行工具 命令名称 全称 用途 jstat JVM Statisti…
深入理解Java虚拟机 -- 读书笔记:JVM运行时数据区域 本文转载:http://blog.csdn.net/jubincn/article/details/8607790 本系列为<深入理解Java虚拟机 >(周志明著)读书笔记. Java程序员一般都知道JVM中存在栈和堆的,并简单了解对象是在堆上分配的,这点从C/C++转过Java的程序员很容易想到.但Java由于其自身的特性,还有一些其他的内存区域,如下图所示: 程序计数器 程序计数器占用的内存空间不大,里面记录了各线程当前字节码的…