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. BZOJ 3167 [Heoi2013]Sao ——树形DP

    BZOJ4824的强化版. 改变枚举的方案,使用前缀和进行DP优化. 然后复杂度就是$O(n^2)$了. #include <map> #include <cmath> #in ...

  2. AIX 常用命令 第一步(uname,lspv)

    如何知道自己在运行单处理器还是多处理器内核? /unix 是指向已启动内核的符号链接.要了解正在运行什么内核模式,可输入 ls -l /unix 并查看 /unix 链接到什么文件.下面是 ls -l ...

  3. 洛谷P1120 小木棍(sticks数据加强版)

    题目描述 乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过50. 现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍和它们的长度. 给出每段小木棍的长度,编 ...

  4. css3 容器内容垂直居中

    .item{ top: 50%; position: absolute; transform: translateY(-50%); /* 这里我们使用css3的transform来达到类似效果 */ ...

  5. Java面试进阶部分集合

    框架基础 反射:反射是Java开发的一类动态相关机制.因为本身Java语言并不是一款动态语言,如果我们想要得到程序动态的效果,因此便引入了反射机制这一概念. 怎么表达反射? 能用反射做什么? PS:某 ...

  6. pycharm上传代码到码云错误现象用户密码

    >>出现此时错误说明在pycharm>git登录用户名或密码是错误的(必须填成是自己注册的码云邮箱和密码 不允许出现中文)并且无法在当前修改用户名或密码 >>接下来打开电 ...

  7. 【UTR #2】题目交流通道

    题目描述 定好了难度,雄心勃勃的吉米多出题斯基开始寻找智慧的神犇星球的居民出题. 然而吉米多出题斯基没有料到,神犇星球的居民告诉吉米多出题斯基:"今年神犇星球经济不景气,大家都想宅在家里,哪 ...

  8. window下安装tensowflow

    tensorflow0.12版本支持windows,但是需要python3.5.x.而我的本机只安装了Anaconda2.7版本.因此我们可以在Anaconda中新增Python3.5的环境. 首先, ...

  9. xcopy中文文件名,中文件目录乱码问题

    1.保存成bat脚本文件 2.且该bat文件不能使用utf-8格式,使用ANSI即正常

  10. memcachq队列安装

    memcacheq是集中的队列小软件,使用起来简单,便捷,高效. 下载 http://git.oschina.net/sgfoot/linux-tools/raw/master/memcacheq-0 ...