Java之GC

GC:GC 是JVM的垃圾回收器。与C/C++不同,java程序员无需考虑太多内存分配的位置,更不用考虑内存释放的机制,java对象内存的申请和释放都有JVM托管。JVM的内存释放机制就是GC。
GC的过程分为获取内存释放时机、遍历无用java对象、释放算法如何选择并调度、GC的种类、JVM内存布局。
首先介绍下JVM的内存布局,在JVM中,内存分为虚拟机栈、堆区、方法区、本地方法栈、程序计数器。
程序计数器是被线程似有的,指向当前线程所执行到的字节码。
1、虚拟机栈是JVM保存待执行的java方法的数据区,所有待执行的java方法会以栈帧的数据形式出栈和入栈,这一过程也表现了java方法的执行过程。
2、本地方法栈是保存的是本地方法?(本地方法如c/c++应该和JVM在操作系统上处于同一层次,为啥能被JVM操作)本地方法栈为本地方法服务,在执行一个本地方法时,虚拟机栈会被保存状态等待本地方法返回(该虚拟机栈中的方法不会被执行引擎加载执行,而是等待方法的返回)(1、本地方法栈类似于对虚拟内存栈区的映射2、本地方法栈中压入的是本地方法的接口声明,通过执行引擎加载本地方法库来获取本地方法的实现。3、倾向于后者)。
3、方法区保存类型信息。每一个类的class信息包括类名、父类、接口,和静态变量、类方法。
虚拟机栈、程序计数器、本地方法栈都是线程所私有,方法区被线程共享,而堆区是JVM的。
4、堆区存储的是java对象、包括class对象。有JVM托管,申请和释放。堆区是GC的主战场。
-------------------------------------------------------------------
堆被划分为两大区域,young和old(老年代和新年代)。young被分为Eden,servivor1/2。新生对象内存的申请主要是在Eden和其中一块servivor中,另一块servivor作为保留,在复制-释放时,作为存活对象重新排列的容器。GC分为Major GC、 Full GC、 Minor GC。
1、GC获取内存释放时机:一般发生在new时即JVM分配堆区内存的时候。当Eden区满的时候触发Minor GC,当old满时触发Full GC
GC的策略有复制-释放、标记-释放两种。复制释放就是遍历获取无用的java对象,将仍然存活的对象复制到另一块内存中,再将第一块内存中的所有对象全部释放。标记-释放就是先遍历获取无用的java对象,标注标记,在第二次遍历时将标记的对象释放。复制释放的优点是存活对象将获得重新排列,降低了内存碎片的产生;缺点是必须有另一块足够的内存来容纳存活对象,同时复制花费了大量的开销。标记-释放的优点是无需复制的开销和第二块内存的开销,缺点是产生内存利用率降低,内存碎片的数量大大增加甚至导致大块内存无法申请。
在JVM采用自适应的方式通过存活内存的多少、在堆区中排列松紧判断采用复制-释放还是标记-释放。当不在使用的对象的数量较少时使用标记-释放,当对象排列松散、内存碎片过量时使用复制-释放。
2、获取无用对象:怎样获取不再使用的对象呢,JVM使用从root节点搜索的方式,从root节点遍历对象链表,与root节点不连续的java对象即是不适用的对象,该对象将被释放。
3、如何调度:上文说道,JVM将采取自适应的方式调度释放算法,堆内存的划分就是由此而来。Eden区和其中一块servivor将作为内存申请的区域,而另一块servivor将用来在复制-释放时保存重新排列的对象,然后新的内存申请就将在后一块servivor和Eden中进行,而前一块用来保存下一次GC存活下来的对象。old域中保存的对象是永久或者长久存在的对象,经过多次GC后没有被释放,就会被移交到old中,由此可知,新生代young中保存的多是存活周期比较短的,比较久的会在多次GC没有释放后移交到老年代old中。所以Eden的内存被设计得远远大于servivor1/2,(在GC后young中仍然存在的内存是比较少的一部分,一个servivor就能保存)。
4、Full GC何时触发:
    永久代无空间申请、新升入永久代的对象内存大于永久代空余的内存、JVM加载的clas信息占用内存大于Pen Gen区内存、等。

Java之GC的更多相关文章

  1. JVM学习(4)——全面总结Java的GC算法和回收机制

    俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及到的知识点总结如下: 一些JVM的跟踪参数的设置 Java堆的分配参数 -Xmx 和 –Xms 应该保持一个什么关系,可以让系统的 ...

  2. Java -verbose:gc 命令

    Java -verbose:gc 中参数-verbose:gc 表示输出虚拟机中GC的详细情况. [Full GC 168K->97K(1984K), 0.0253873 secs]   解读如 ...

  3. JAVA 从GC日志分析堆内存 第七节

    JAVA 从GC日志分析堆内存 第七节   在上一章中,我们只设置了整个堆的内存大小.但是我们知道,堆又分为了新生代,年老代.他们之间的内存怎么分配呢?新生代又分为Eden和Survivor,他们的比 ...

  4. JVM学习(4)——全面总结Java的GC算法和回收机制---转载自http://www.cnblogs.com/kubixuesheng/p/5208647.html

    俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及到的知识点总结如下: 一些JVM的跟踪参数的设置 Java堆的分配参数 -Xmx 和 –Xms 应该保持一个什么关系,可以让系统的 ...

  5. Java的GC

    垃圾收集 在探究Jvm的过程中,有两个点特别需要关注,一是:内存的使用,分配策略,而这一点是在前一篇博客已经介绍过了. 二是:内存的回收.也就是这一篇博客所要探究的关键点. 内存回收需要关注的几个点: ...

  6. jvm系列(六):Java服务GC参数调优案例

    本文介绍了一次生产环境的JVM GC相关参数的调优过程,通过参数的调整避免了GC卡顿对JAVA服务成功率的影响. 这段时间在整理jvm系列的文章,无意中发现本文,作者思路清晰通过步步分析最终解决问题. ...

  7. 为什么Java有GC调优而没听说过有CLR的GC调优?

    前言 在很多的场合我都遇到过一些群友提这样的一些问题: 为什么Java有GC调优而CLR没有听说过有GC调优呢? 到底是Java的JVM GC比较强还是C#使用的.NET CLR的GC比较强呢? 其实 ...

  8. Java中GC的工作原理

    转文: 一个优秀的Java程序员必须了解GC的工作原理.如何优化GC的性能.如何与GC进行有限的交互,有一些应用程序对性能要求较高,例如嵌入式系统.实时系统等,只有全面提升内存的管理效率,才能提高整个 ...

  9. 也学习Java/JVM/GC(四)

    GC日志分析 程序代码: public class JvmTest { public static void main(String[] args) { int m = 1024 * 1024; by ...

随机推荐

  1. iOS 10.10 10.11 10.12 安装升级CocoPods

    CocoPods简介 CocoaPods是一个用Ruby写的,负责管理iOS以及OSX系统下的一个第三方类库管理工具,通过CocoaPods,我们可以集中,统一的管理第三方开源库.当然这些库徐亚Coc ...

  2. STL --> 高效使用STL

    高效使用STL 仅仅是个选择的问题,都是STL,可能写出来的效率相差几倍:
熟悉以下条款,高效的使用STL:   一.当对象很大时,建立指针的容器而不是对象的容器 1)STL基于拷贝的方式的来工作,任 ...

  3. HashMap的底层原理

    简单说: 底层原理就是采用数组加链表: 两张图片很清晰地表明存储结构: 既然是线性数组,为什么能随机存取?这里HashMap用了一个小算法,大致是这样实现: // 存储时: int hash = ke ...

  4. JQuery操作option的添加、删除、取值

    1. $("#select_id").change(function(){//code...}); //为Select添加事件,当选择其中一项时触发 2. var checkTex ...

  5. JavaScript(第二十四天)【事件对象】

    JavaScript事件的一个重要方面是它们拥有一些相对一致的特点,可以给你的开发提供更多的强大功能.最方便和强大的就是事件对象,他们可以帮你处理鼠标事件和键盘敲击方面的情况,此外还可以修改一般事件的 ...

  6. 数据结构——线性表——队列(queue)

    队列也是一种特殊的线性表,它的特点是先入先出(FIFO,即first in first out).它的意思也很直观,想象一下排队买票,先排的人先买(插队是不对的,所以别去想).它也是很常用的数据结构, ...

  7. docopt——好用的Python命令行参数解释器

    Qingchat使用的命令行参数解释器是 docopt,用下来感觉非常棒,所以决定介绍一下这个库.( 奉劝各位看官,真爱生命,远离argparse. ) 介绍 docopt 本质上是在 Python ...

  8. OptaPlanner - 把example运行起来(运行并浅析Cloud balancing)

    经过上面篇长篇大论的理论之后,在开始讲解Optaplanner相关基本概念及用法之前,我们先把他们提供的示例运行起来,好先让大家看看它是如何工作的.OptaPlanner的优点不仅仅是提供详细丰富的文 ...

  9. 第二篇:利用shell脚本执行webservice请求——基于soap

    1. 项目背景 以往我们在开发基于webservice的项目中,我们总习惯于直接使用webservice的一些框架,如Axis,axis2和Xfire等.框架的好处是将webservice所涉及到的s ...

  10. react中的DOM操作

    前面的话 某些情况下需要在典型数据流外强制修改子代.要修改的子代可以是 React 组件实例,也可以是 DOM 元素.这时就要用到refs来操作DOM 使用场景 下面是几个适合使用 refs 的情况 ...