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工作笔记

    1. Linux基础 1.1. Unix 1965年,AT&T贝尔电话实验室.通用电气公司.麻省理工学院MAC课题组一起联合开发一个称为Multics的新操作系统.该项目目的是让大型主机可以同 ...

  2. 搜索引擎快捷导航:一个简单的chrome插件(教程)

    一.如何通过练习来提高学习新框架的最好姿势是:基于现有的业务来学习.即从工作中学习,从实践中学.但是,如果一直只使用新的框架来重写旧的业务,成长也会趋近于0.第一次,使用新框架时收获可能颇丰:第二次, ...

  3. 学习 JSP:第三步 JSP基础(未完)

    因为之前学过也用过JSP,这里只列出笔记,初学者请移步其他教程. JSP隐含对象 JSP支持九个自动定义的变量,江湖人称隐含对象.这九个隐含对象的简介见下表: 对象 描述 request HttpSe ...

  4. 不支持模块化规范的插件可以使用import 导入的原因

    模块化当中的模块其实是个闭包,然后导出这个闭包,这个是为了解决全局变量污染的问题的. 所以模块当中直接定义的变量 比如  var foo = 0; 这个并不会是全局变量,而是当前模块闭包当中的局部变量 ...

  5. IOs动画的那些事儿

    CoreAnimation介绍 1:Core Animation是直接作用在CALayer上的(并非UIView上)非常强大的跨Mac OS X和iOS平台的动画处理API,Core Animatio ...

  6. Android调起地图导航

       想要使用导航功能可以使用各个地图的开放平台集成导航模块,如果不想集成也可以调起相关app导航 调起其他app首先得使用到该app包名,先贴出来 public final static Strin ...

  7. guake使用

    1. 安装:sudo apt-get install guake 2. 在终端输入guake 3. f12:显示/隐藏 4. f11:全屏/正常屏切换 5. f2:重命名终端名 6. 还可以查看修改快 ...

  8. ArcGIS 安装中,SQL的使用出现错误的解决

    1. SQL Server Configuration Manager 中 SQL Server Services出现 “远程调用失败..” 的问题 解决方法是卸载

  9. Android自定义控件之基本原理(一)

    前言: 在日常的Android开发中会经常和控件打交道,有时Android提供的控件未必能满足业务的需求,这个时候就需要我们实现自定义一些控件,今天先大致了解一下自定义控件的要求和实现的基本原理. 自 ...

  10. C# 使用xenocode混淆加密【转】

    http://www.cnblogs.com/chendaoyin/archive/2013/05/03/3056692.html   之前就了解过混淆加密工具,但这还是第一次使用,选择了xenoco ...