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. 数据库数据带&符号 导入有问题的处理办法

    在sql文件头部加个: set feedback off set define off   我们在plsql里面将一条语句导出时会出现以下结果(测试表t_test): prompt Importing ...

  2. JavaWeb学习笔记二 Http协议和Tomcat服务器

    Http协议 HTTP,超文本传输协议(HyperText Transfer Protocol),是互联网上应用最为广泛的一种网络协议.所有的WWW文件都必须遵守这个标准.设计HTTP最初的目的是为 ...

  3. Leetcode 4——Partition List

    Problems: Given a linked list and a value x, partition it such that all nodes less than x come befor ...

  4. Alpha冲刺集合

    Alpha冲刺集合 Day1 http://www.cnblogs.com/bugLoser/p/7901016.html Day2 http://www.cnblogs.com/bugLoser/p ...

  5. HDFS架构

  6. 20162323周楠《Java程序设计与数据结构》第八周总结

    20162323周楠 2016-2017-2 <程序设计与数据结构>第八周学习总结 教材学习内容总结 一个异常是一个对象,它定义了并不轻易出现的或是错误的情形 异常由程序或运行时环境抛出, ...

  7. java实现同步的两种方式

    同步是多线程中的重要概念.同步的使用可以保证在多线程运行的环境中,程序不会产生设计之外的错误结果.同步的实现方式有两种,同步方法和同步块,这两种方式都要用到synchronized关键字. 给一个方法 ...

  8. 我所知道的window.location

    多说无益 直接上干货 假如一个地址为  http://127.0.0.1:5000/index.html?id=4 window.location.href -- 完整路径 -- http://127 ...

  9. kali rolling更新源之gpg和dirmngr问题

    1.编辑 /etc/apt/source.list gedit /etc/apt/sources.list 输入更新源,可以选任何可用更新源,这里设置官方源 deb http://http.kali. ...

  10. lua保存table到文件并从文件解析成table

    require("json") result = { ["ip"]="192.168.0.177", ["date"]= ...