java的内存结构:

  1. 堆: java所有通过new新建的对象都是在堆上进行分配的; 根据不同的垃圾回收算法, 堆的结构也不相同, 如果采用的是分代垃圾回收, 那么堆就分为年轻代和年老代两部分.

  2. 栈: 每个线程执行每个方法的时候都会在栈中申请一个栈帧,每个栈帧包括局部变量区和操作数栈,用于存放此次方法调用过程中的临时变量、参数和中间结果

  3. 本地方法栈: 用于存放native方法的执行状态

  4. 方法区: 存放了已加载的类信息、静态变量、final类型的常量、属性和方法信息以及JIT编译后的代码。JVM用持久代(PermanetGeneration)来存放方法区

java线程私有的部分:  程序计数器, java虚拟机栈, 本地方法栈

java线程共享的部分: java堆, 方法区, 运行时常量池(也是方法区的一部分, 用于存放编译时生成的各种字面值和符号引用), 直接内存(例如: NIO的directBuffer申请的内存和native方法申请的内存)

stop-the-world : jvm停止应用程序, 而去进行垃圾回收; 当stop-the-world发生时, 除了垃圾回收的线程之外, 其他所有线程都将停止直到gc完成.

gc调优就是为了减少stop-the-world的时间和次数.

垃圾回收算法:

1. mark-sweep算法(标记-清理算法)

  1. 标记: 将所有需要回收的对象标记出来

  2. 清理: 回收所有标记对象的内存空间

  会产生内存碎片问题(需要的压缩(将存活对象移动到一端)来解决)

2. copying算法(复制算法)

  1. 将内存按容量划分为大小相同的两块, 每次只使用其中的一块, gc发生时, 将存货的对象复制到另外一块

  无内存碎片, 但是内存利用率低, 而且当存活对象较多时, copying的效率很低

3. mark-compact算法(标记-整理算法)

  1. mark: 标记

  2. compact: 不清理可回收对象, 而是将存活对象向一端移动, 对可回收对象进行覆盖, 然后将边界外的所有内存进行清理

4. 分代垃圾回收算法

  分代垃圾回收基于两个前提:

    1. 绝大多数对象的存活期都很短, 都会在短时间内变得不可达

    2. 只有少量年老对象会引用年轻对象

  永生代(permanent generation) : 也称方法区, 存储class对象与字符串常量, 发生在这里的gc也称为major gc

  年轻代(young generation) : 绝大多数新创建的对象都分配在这里, 基于前面的两个前提, 绝大多数年轻代对象都会在一段时间后消失. 当对象从年轻代消失, 就称发生了一次minor gc. 年轻代的组成: 1. eden区: 绝大多数新创建的对象都分配在eden区 ; 2. 两块survivor区 : 在eden发生一次gc, 将存活对象移动到survivor区, 一旦一个survivor区满, 就将存活对象转移到另一块survivor区. 一段时间后, 将survivor中存货的对象转移到年老区.(copying算法)

  年老代(old generation) : 在年轻代没有变得不可达的对象会转移到年老代; 或者需要内存较大的对象会直接分配在年老代; 年老代的内存要比年轻代大得多; 年老代发生的gc也称为major gc或full gc.

  年老代的garbage collector:

    1. serial收集器: 串行gc, 适用于单cpu, 新生代空间较小, 对暂停时间要求不高的应用上, 是client端的默认gc, 不能用于server端. 年轻代使用copy算法(serial收集器, 年老代使用mark-compact算法(serial old收集器).

    2. parallel scavenge收集器: 并行gc, 使用多线程并行处理gc, 适用于多cpu, 对暂停时间要求较高的应用, 是server端的默认收集器, 使用copying算法

    3. parallel old收集器: 与parallel scavenge收集器的唯一区别是使用的算法不同, 他使用的是mark-sweep算法

    4. cms收集器: 使用mark-sweep算法, 拥有更短的stop-the-world时间, 但会占用更多的cpu与内存, 默认是不支持压缩步骤

    5. g1收集器: 每个对象都分配在不同的网格中, 当一个网格填满后, 对象会被移动到另一个区域, 并执行一次垃圾回收. 它比任何其他gc算法都要快, 是一种前沿的gc.

//http://www.cnblogs.com/dolphin0520/p/3783345.html

//http://www.cnblogs.com/laoyangHJ/articles/java_gc.html

//http://blog.jobbole.com/80499/

java gc小结的更多相关文章

  1. [Java基础]-- Java GC 垃圾回收器的分类和优缺点

    https://blog.csdn.net/high2011/article/details/80177473?utm_source=blogxgwz2 参考:elasticsearch实战-使用G1 ...

  2. 面试官,不要再问我“Java GC垃圾回收机制”了

    Java GC垃圾回收几乎是面试必问的JVM问题之一,本篇文章带领大家了解Java GC的底层原理,图文并茂,突破学习及面试瓶颈. 楔子-JVM内存结构补充 在上篇<JVM之内存结构详解> ...

  3. 详解Java GC的工作原理+Minor GC、FullGC

    详解Java GC的工作原理+Minor GC.FullGC 引用地址:http://www.blogjava.net/ldwblog/archive/2013/07/24/401919.html J ...

  4. Java中文编码小结

    Java中文编码小结 1. 只有 字符到字节 或者 字节到字符 的转换才存在编码转码; 2. Java String 采用 UTF-16 编码方式存储所有字符.unicode体系采用唯一的码点表示唯一 ...

  5. Java GC回收机制

    优秀Java程序员必须了解的GC工作原理 一个优秀的Java程序员必须了解GC的工作原理.如何优化GC的性能.如何与GC进行有限的交互,因为有一些应用程序对性能要求较高,例如嵌入式系统.实时系统等,只 ...

  6. JAVA GC 简单总结

    GC分代 GC的英文全拼是Garbage Collection,意思是垃圾收集. Java 将堆内存分为三代来管理: - 年轻代 (Young Generation) - 年老代 (Old Gener ...

  7. Java GC收集器配置说明

    根据Java GC收集器具体分类,我们可以看出JVM根据需求不同提供了三种选择:串行收集器.并行收集器.并发收集器. 串行收集器只适用于小数据量的情况,我们主要了解一下并行收集器和并发收集器.默认情况 ...

  8. java gc的工作原理、如何优化GC的性能、如何和GC进行有效的交互

    java gc的工作原理.如何优化GC的性能.如何和GC进行有效的交互 一个优秀的Java 程序员必须了解GC 的工作原理.如何优化GC的性能.如何和GC进行有效的交互,因为有一些应用程序对性能要求较 ...

  9. Java GC系列(4):垃圾回收监视和分析

    本文由 ImportNew - lomoxy 翻译自 javapapers. 目录 垃圾回收介绍 垃圾回收是如何工作的? 垃圾回收的类别 垃圾回收监视和分析 在这个Java GC系列教程中,让我们学习 ...

随机推荐

  1. Linux 终端操作之「I/O Redirection」

    I/O 重定向是在终端运行程序时很常用的技巧,但是我对它所知甚少.今天我在 DigitalOcean 上发现了一篇很好的 tutorial.这篇随笔记录一下我的心得体会和发现的一个问题. I/O re ...

  2. outline:0与outline:none区别

    outline:0与outline:none的效果完全一样,用哪个都行,为了少写几个字,提倡用outline:0.具体区别如下: 出处: https://stackoverflow.com/quest ...

  3. 【BZOJ3529】数表(莫比乌斯反演,BIT,自然溢出)

    题意: 思路: #include<cstdio> #include<cstring> #include<string> #include<cmath> ...

  4. 如何用DW设计界面 结合 VS设计后台代码

    原文发布时间为:2008-11-02 -- 来源于本人的百度文章 [由搬家工具导入] 问:在vs.net里有form标记,而dw里却没有,两个里面的标记代码都不一样,怎么能通用? 在.net里修改dw ...

  5. XML 增、删、改和查的实例【转】

    原文发布时间为:2008-08-10 -- 来源于本人的百度文章 [由搬家工具导入] 原文地址:http://www.cnblogs.com/skylaugh/archive/2006/12/18/5 ...

  6. set up trace code tool

    這以 GNU GLOBAL 6.5.6 為示範 1: install GNU GLOBAL https://www.gnu.org/software/global/download.html sudo ...

  7. Codeforces Gym101606 A.Alien Sunset (2017 United Kingdom and Ireland Programming Contest (UKIEPC 2017))

    2017 United Kingdom and Ireland Programming Contest (UKIEPC 2017) 寒假第一次组队训练赛,和学长一起训练,题目难度是3颗星,我和猪队友写 ...

  8. Intellij从无到有创建项目

    Intellij虽然提供了很多模板可以创建maven web javaee等等各种项目,但是你知道项目从无到有到底怎么来的,各个配置分别是做什么的?现在就来一步步说明. 1.idea打开一个空文件夹: ...

  9. Codeforces Gym 100338B Spam Filter 字符串哈希+贝叶斯公式

    原题链接:http://codeforces.com/gym/100338/attachments/download/2136/20062007-winter-petrozavodsk-camp-an ...

  10. JVM类加载机制————2

    类加载机制的第一个阶段加载做的工作有: 1.通过一个类的全限定名(包名与类名)来获取定义此类的二进制字节流(Class文件).而获取的方式,可以通过jar包.war包.网络中获取.JSP文件生成等方式 ...