`
panshaobinSB
  • 浏览: 202825 次
  • 性别: 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
分享到:
评论

相关推荐

    GC基本调优工具介绍

    8. **GC日志分析**:通过设置JVM参数,我们可以开启GC日志,然后使用第三方工具(如GCMV,GcViewer)对日志进行分析,了解GC的运行模式和问题。 在进行GC调优时,通常需要关注以下几个关键指标: - **Full GC频率**...

    5GC基本流程培训1.pdf

    标题《5GC基本流程培训1.pdf》和描述《5GC基本流程》指向的内容...了解5GC基本流程对于通信行业的专业人员来说至关重要,它帮助技术人员掌握如何部署和管理5G核心网络,以及如何支持未来可能增长的多种网络服务和应用。

    SENSOR_GC1054.rar_1054-sensor_SENSOR_GC1054_gc1054

    标题中的"SENSOR_GC1054.rar_1054-sensor_SENSOR_GC1054_gc1054"暗示了我们...他们可以通过学习和修改"SENSOR_GC1054.c"代码,了解传感器的工作原理,以及如何通过编程实现对传感器的精细控制,从而优化其性能和功能。

    MT6261_GC6153_Driver_V0_格科微gc61538w_GC6153_格科微_格科微GC6153@_mt6261

    在V0.2010.110版本中,我们可以推测这是2010年11月的一个早期版本,可能包含了基本的功能实现和初步的稳定性测试。 驱动开发的关键在于理解和适配硬件特性。对于SPI接口,开发者需要编写代码来设置时钟频率、极性、...

    GC-powerstation 9.1.2

    在深入理解GC-powerstation 9.1.2之前,我们需要知道GC的基本原理。垃圾收集器的工作方式通常包括标记、清除、复制、压缩等步骤,其目标是在不中断程序运行的情况下,找到并回收不再使用的内存。不同类型的GC策略...

    GC-Place软件及使用教程

    首先,我们要了解GC-Place的基本功能。GC-Place是一款高效且精准的贴片机编程软件,主要负责将GERBER文件转换为贴片机可识别的程序。GERBER文件是电子制造中的标准格式,包含了电路板的层信息,如元件位置、尺寸、...

    格科微原厂GC2053数据手册 CSP Datasheet V1.2--20190409(V1.2版)

    1. **概述**:这部分会简要介绍GC2053芯片的基本信息,包括其设计目标、主要特性以及应用领域。例如,GC2053可能是一个专为高清摄像头设计的CMOS图像传感器,具有高分辨率、低噪声、宽动态范围等特点。 2. **技术...

    tomcat GC 优化配置

    在深入探讨优化配置之前,我们首先了解一些基础的概念和算法: 1. **引用计数(Reference Counting)**:这是一种较早的回收算法,通过增加或减少对象的引用计数来决定是否回收该对象。然而,这种方法无法解决循环...

    GC9305_TFT_LCD_DriverIC_datasheet.pdf

    1. 介绍(Introduction):文档开始部分一般会介绍GC9305的基本信息,包括其用途和主要特性。 2. 特点(Features):列出了GC9305的核心特性,比如分辨率、色彩深度、支持的接口类型等。 3. 块图(Block Diagram)...

    gcviewer-1.29-bin.zip

    首先,让我们了解一下GCViewer的基本操作。下载并解压"gcviewer-1.29-bin.zip"后,你将得到一个包含jar文件的目录。运行GCViewer,只需要在命令行输入`java -jar gcviewer.jar`,然后选择你的GC日志文件进行加载。...

    Visual GC(监控垃圾回收器)

    通过VisualVM,开发者可以深入到Java应用程序的内部,了解GC的工作原理,优化内存分配,减少不必要的内存消耗,降低GC停顿时间,从而提升整体性能。同时,VisualVM的易用性使得性能分析不再是一项复杂的任务,即便是...

    jvm gc

    了解并掌握JVM的GC机制,有助于我们更好地优化Java应用程序,减少垃圾收集带来的性能影响,确保系统的稳定性和高效运行。通过深入研究JVM源码,我们可以更深入地理解这些概念,并能有效地解决实际遇到的性能问题。

    优秀的Java程序员必须了解GC的工作原理

    ### 优秀的Java程序员必须了解GC的工作原理 #### 一、GC的基本原理 Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是Java内存管理的关键组成部分。了解GC的工作原理对于优化Java程序至关重要,尤其是在...

    龙芯 GC3210嵌入式开发手册

    该手册的目的是帮助读者全面了解如何利用GC3210进行有效的系统级开发。 在学习GC3210嵌入式开发的过程中,首先需要理解MIPS架构的基本概念。MIPS(Microprocessor without Interlocked Pipeline Stages)是一种精简...

    深入理解JVM & G1 GC

    下面将详细阐述JVM、GC的基本概念,以及G1 GC的工作原理和调优策略。 首先,Java虚拟机(JVM)是Java程序运行的平台,它负责执行字节码,并提供内存管理、类加载、安全管理等服务。JVM的内存结构主要分为堆、栈、...

    GC-STATION操作手册

    手册的这一部分介绍了GC-STATION的基本功能和操作界面,帮助用户熟悉操作接口和画面显示。其中,硬设备需求是用户在安装系统之前需要了解的重要信息,包括操作系统版本、CPU要求、内存大小、硬盘空间、光驱速度以及...

    GC8870+说明书V1.0.pdf

    GC8870的基本特点包括独立的H桥电机驱动器、宽工作电压范围(6.5V至45V)、565mΩ的典型导通电阻(HS+LS)、3.6A的峰值电流驱动能力、脉宽调制(PWM)控制接口以及集成电流调节功能。此外,它还具备低功耗休眠模式和...

    GC-PLACe操作步骤

    首先,我们需要了解GC-PLACe的基本功能——输出*.ASC文件。这个文件是电路板设计的关键输出,包含了所有元件的位置、连线和孔位等信息,供后续的制造过程使用。 第一步,导入文件。这一步至关重要,GC-PLACe支持RS-...

    GC0309 MTK平台

    1. **初始化**:驱动启动时,它会根据`image_sensor.c`中的代码对GC0309进行初始化,包括设置I2C或SPI通信协议、识别传感器型号、设置基本的工作模式。 2. **配置**:根据应用需求,驱动会调整GC0309的参数,例如...

Global site tag (gtag.js) - Google Analytics