`
panshaobinSB
  • 浏览: 197911 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

gc的基本了解

 
阅读更多
JVM内存结构由堆、栈、本地方法栈、方法区等部分组成,结构图如下所示:


堆设置
-Xms :初始堆大小
-Xmx :最大堆大小

-XX:NewSize=n :设置年轻代大小
-XX:NewRatio=n: 设置年轻代和年老代的比值。如:为3,表示年轻代与年老代比值为1:3,年轻代占整个年轻代年老代和的1/4
-XX:SurvivorRatio=n :年轻代中Eden区与两个Survivor区的比值。注意Survivor区有两个。如:3,表示Eden:Survivor=3:2,一个Survivor区占整个年轻代的1/5
-XX:MaxPermSize=n :设置持久代大小

堆的划分如下2个图:



Java堆中各代分布
Young:主要是用来存放新生的对象。
Old:主要存放应用程序中生命周期长的内存对象。
Permanent:是指内存的永久保存区域,主要存放Class和Meta的信息,Class在被 Load的时候被放入PermGen space区域. 它和和存放Instance的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的APP会LOAD很多CLASS的话,就很可能出现PermGen space错误。

2.GC算法:
分代收集。
即将内存分为几个区域,将不同生命周期的对象放在不同区域里;
在GC收集的时候,频繁收集生命周期短的区域(Young area);
比较少的收集生命周期比较长的区域(Old area);
基本不收集的永久区(Perm area)。

新生代的GC:
新生代通常存活时间较短,因此基于Copying算法来进行回收,所谓Copying算法就是扫描出存活的对象,并复制到一块新的完全未使用的空间中,对应于新生代,就是在Eden和FromSpace或ToSpace之间copy。新生代采用空闲指针的方式来控制GC触发,指针保持最后一个分配的对象在新生代区间的位置,当有新的对象要分配内存时,用于检查空间是否足够,不够就触发GC。当连续分配对象时,对象会逐渐从eden到survivor,最后到旧生代.

虚拟机给每个对象定义了一个对象年龄(Age)计数器。如果对象在 Eden 出生并经过第一次 Minor GC 后仍然存活,并且能被 Survivor 容纳的话,将被移动到 Survivor 空间中,并将对象年龄设为 1。对象在 Survivor 区中每熬过一次 Minor GC,年龄就增加 1 岁,当它的年龄增加到一定程度(默认为 15 岁)时,就会被晋升到老年代中。对象晋升老年代的年龄阈值,可以通过参数 -XX:MaxTenuringThreshold 来设置。

串行GC(Serial Copying)
client模式下的默认GC方式,也可使用-XX:+UseSerialGC指定。

并行回收GC(Parallel Scavenge)
server模式下的默认GC方式,也可用-XX:+UseParallelGC强制指定。
采用PS时,默认情况下JVM会在运行时动态调整Eden:S0:S1的比例,如果不希望自动调整可以使用-XX:-UseAdaptiveSizePolicy参数,内存分配和回收的算法和串行相同,唯一不同仅在于回收时为多线程。

并行GC(ParNew)
CMS GC时默认采用,也可以采用-XX:+UseParNewGC指定。
内存分配、回收和PS相同,不同的仅在于会收拾会配合CMS做些处理。

---------------------------------------------------------------

旧生代的GC:
旧生代与新生代不同,对象存活的时间比较长,比较稳定,因此采用标记(Mark)算法来进行回收,所谓标记就是扫描出存活的对象,然后再进行回收未被标记的对象,回收后对用空出的空间要么进行合并,要么标记出来便于下次进行分配,总之就是要减少内存碎片带来的效率损耗。

串行GC(Serial MSC)
client模式下的默认GC方式,可通过-XX:+UseSerialGC强制指定。每次进行全部回收,进行Compact,非常耗费时间。

并行GC(Parallel MSC)
server模式下的默认GC方式,也可用-XX:+UseParallelGC=强制指定。可以在选项后加等号来制定并行的线程数。

并发GC(CMS)线上环境采用的GC方式,也就是Realese环境的方式
使用CMS是为了减少GC执行时的停顿时间,垃圾回收线程和应用线程同时执行,可以使用-XX:+UseConcMarkSweepGC=指定使用,后边接等号指定并发线程数。CMS每次回收只停顿很短的时间,分别在开始的时候(Initial Marking),和中间(Final Marking)的时候,第二次时间略长。




JVM如果不指定-server或-client选项,JVM会在启动的时候根据硬件环境判断以server模式启动还是以client模式启动(适用于Java 5及以上版本)。
JVM工作在server模式可以大大提高性能,但应用的启动会比client模式慢大概10%。当该参数不指定时,虚拟机启动检测主机是否为服务器,如果是,则以server模式启动,否则以client模式启动,Java 5检测的根据是至少2个CPU和最低2GB内存。



3. GC 和 Full GC 有什么区别?
GC(或Minor GC):收集 生命周期短的区域(Young area)。
Full GC (或Major GC):收集生命周期短的区域(Young area)和生命周期比较长的区域(Old area)。
他们的收集算法不同,所以使用的时间也不同。 GC 效率也会比较高,我们要尽量减少 Full GC 的次数。 当显示调用System.gc() 时,gc does a full collection(both young generation and tenured generation).


4. Minor GC后,Eden是空的吗?
是的,Minor GC会把Eden中的所有活的对象都移到Survivor区域中,如果Survivor区中放不下,那么剩下的活的对象就被移到Old generation 中。

5.触发full gc的情况:
a.System.gc();
b.旧生代空间不足:java.lang.outOfMemoryError:java heap space
c.Perm空间满:java.lang.outOfMemoryError:PermGen space
d.CMS GC时出现promotion failed  和concurrent  mode failure,
promotion failed是在Minor GC是,S区域放不下,而此时旧生带也放不下造成的;
concurrent mode failure是在CMS GC的时候,有对象放入旧生代,此时旧生代放不下导致的;
e.统计得到的minor GC晋升到旧生代的平均大小大于旧生代的剩余空间

----先插个图,有空继续整理其他内存区域------


2)栈

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

3)本地方法栈

用于支持native方法的执行,存储了每个native方法调用的状态

4)方法区

存放了要加载的类信息、静态变量、final类型的常量、属性和方法信息。JVM用持久代(PermanetGeneration)来存放方法区,可通过-XX:PermSize和-XX:MaxPermSize来指定最小值和最大值。


http://iamzhongyong.iteye.com/blog/1447314
http://blog.csdn.net/winniepu/article/details/4829087
http://www.blogjava.net/ldwblog/archive/2013/07/24/401919.html
http://book.51cto.com/art/201011/235575.htm
  • 大小: 18.3 KB
  • 大小: 31.7 KB
  • 大小: 29 KB
  • 大小: 14.8 KB
  • 大小: 134.6 KB
分享到:
评论

相关推荐

    JVM:GC机制

    如果你对jvm没有基本的了解,那么你可以先了解jvm之后再参阅本人会更便于理解 建议参考文章:《一张图看懂JVM》 垃圾回收机制(GC) 首先要知道一些概念 年轻代、老年代、Eden区、Survivor区 年轻代:由Eden区、...

    GC5322_DPD数据分析.pdf

    GC5322 是 TI 推出的一款强大的 DPD 处理芯片,它内部包括 DUC,CFR 和 DPD 的处理模 块。介绍了 GC5322 系统中如何对抓取的数据进行分析,从而定位 DPD 相关问题。对 GC5322 及 DPD 有基本的了解。

    成为JavaGC专家(4)

    在第一篇文章成为JavaGC专家PartI—深入浅出Java垃圾回收机制中我们学习了不同GC算法的执行过程,GC如何工作,新生代及老年代的基本概念,在JDK7中你应该了解的5种GC类型以及他们的性能如何。在第二篇文章成为JavaGC...

    .NET垃圾回收器(GC)原理浅析

    作为.NET进阶内容的一部分,垃圾回收器(简称GC)是必须了解的内容。本着“通俗易懂”的原则,本文将解释CLR中垃圾回收器的工作原理。 基础知识 托管堆(Managed Heap) 先来看MSDN的解释:初始化新进程时,运行时会为...

    JVM内存管理及GC原理调优实战

    在去做这项工作前就必须去了解JVM是怎么去管理内存的,GC是怎么完成的。 二、标记算法 垃圾回收是对已经分配出去的但又不再使用的内存进行回收,以便能够再次分配。JVM主要是对堆空间那些死亡对象所占据的空间进行...

    谈谈你对垃圾回收机制的了解?.docx

    选定活动对象作为 GC Roots,然会跟踪引用链,如果一个对象和GC Roots之间不可达,也就是说不存在引用链,那么即可认为是2可回收对象。jvm会把虚拟机栈和本地方法栈中正在引用的对象、静态属性引用的对象和常量,...

    JVM的GC如何判断对象是否死亡?

    这节我们主要讲垃圾收集的一些基本概念,先了解垃圾收集是什么、然后触发条件是什么、最后虚拟机如何判断对象是否死亡。 一、前言   我们都知道Java和C++有一个非常大的区别就是Java有自动的垃圾回收机制,经过半...

    leetcode和oj-gc-algorithm-course:gc算法课程2014

    GC Algorithm Course 2014 11月6日 八种排序算法 文件:sort.cpp 其实是数据结构课程设计交的作业 冒泡排序 O(n^2) 选择排序 O(n^2) 插入排序 O(n^2) — 对于基本有序的数列效率最高 希尔排序 O(nlogn) — 插入排序...

    Java后端面试问题整理.docx

    • 熟悉JVM内存区域,常用引用类型,垃圾回收机制、算法以及常见的GC垃圾收集器(Serial、ParNew、Parallel Scavenge、Serial Old、Parallel Old、CMS、G1) • 熟悉常用IO模型(BIO、NIO、AIO),熟悉JVM类加载过程与...

    Java高级工程师简历模板18k+

    3.对Java虚拟机、JMM、垃圾收集机制、GC算法、JVM常用配置参数、GC参数、classLoader、锁机制、JVM故障分析,jmap,jstack等jdk提供的工具命令,性能监控工具(java visualVM),JVM参数调优有一定了解; 4.熟悉java...

    IDG_gc_1007_gc_12_GuardiansOfCSS:该存储库是IDG1293 Avansert CSS类的一部分

    本课程首先回顾并扩展IDG1292中引入的基本概念,然后继续介绍新的高级CSS主题。 将指导学生使用CSS进行响应式网站的设计,实施和测试。主题响应式设计,渐进增强和平滑降级CSS设计和用户体验之间的交集先进的灵活...

    3Java性能优化三.zip

    三,JVM优化 因为JAVA软件总是执行在JVM虚拟机之上。...须要开发者对JVM的执行原理和基本内存结构有一定的了解。如,堆内存的结构,GC的种类等。然后,根据引用程序的特点。设置合理的JVM启动參数。

    4Java性能优化四.zip

    三,JVM优化 因为JAVA软件总是执行在JVM虚拟机之上。...须要开发者对JVM的执行原理和基本内存结构有一定的了解。如,堆内存的结构,GC的种类等。然后,根据引用程序的特点。设置合理的JVM启动參数。

    5G系统架构总结

    目前从事的主要是手机终端的工作,因此仅仅先了解5G无线终端的系统架构,不涉及核心网。内容主要是参考网上各种资料做的个人总结。基本架构图如下:网元功能 gNB向UE提供NR用户面和控制面协议终端的节点,并且经由NG...

    partial debug感悟

    1、GC Python中的垃圾回收机制(Garbage ...基本上没咋细看,stack overflow上面通过代码查询了解了大致的原因,多数是跟机器配置的环境、现存有关系 4、tqdm是个神器,在许多的训练代码中都可以看见tqdm的身影

    基于关联规则的股票模式挖掘与对应分析

    根据以上研究,可以了解到:在A股市场中,判别指标值越高,满足要求的股票数量越少; 相同的判别指标值,各板块之间的库存比例有所不同。 置信度P1,P2和Lift与GC(General Capital)密切相关,而Lift与Ind...

    达内java培训目录

    了解JQuery基本设计原则;了解多种JQuery插件;掌握DWR的基本原理及应用技巧。 Spring技术 Spring Ioc基础、Ioc注入技巧、对象高级装配(自动装配、模板装配、组件扫描特性、FactoryBean、对象生命周期)、Spring ...

    A-Probabilistic-Visual-Question-Answering-Model-Based-VQA:视觉问答(VQA)是一个系统,该系统将图像作为输入和关于图像的问题,并使用复杂的推理生成自然语言的答案。 因此,VQA需要对图像有详细的了解,并需要复杂的原因来预测答案。 该项目引入了预训练模型(VGGNet)来提取图像特征,并使用Word2Vec嵌入单词,并使用LSTM从问题中获取单词特征,并将结果组合后将预测出具有最高概率的答案

    因此,VQA需要对图像有详细的了解,并需要复杂的原因来预测答案。 该项目引入了一种预训练模型(VGGNet)来提取图像特征,并使用Word2Vec嵌入单词,使用LSTM来从问题中获取单词特征,将结果组合后将预测出具有最高...

    java内存溢出

    为了判断Java中是否有内存泄露,我们首先必须了解Java是如何管理内存的。Java的内存管理就是对象的分配和释放 问题。在Java中,程序员需要通过关键字new为每个对象申请内存空间 (基本类型除外),所有的对象都在堆 ...

Global site tag (gtag.js) - Google Analytics