`
jobar
  • 浏览: 349032 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

了解GC

 
阅读更多
每个搞java的都可能碰到OOME问题,通常的建议包括:
1 首先尝试增加MaxPermSize大小
2 增加最大堆内存-Xmx

本文将用Hotspot作为我们的JVM,介绍
GC,minor & Full GC, OOME以及JVM调优选项。

1 GC
  GC负责:分配内存,确保引用对象保留在内存里,回收那些不再被引用的不可达对象的内存。
  这个查找并移除可回收对象的过程可能会使应用程序暂停。
  由Hotspot VM提供的GC是一个分代GC——内存被划分为几个部分,也就是说每一部分容纳不同生命周期的对象。这种设计是基于弱分代假说理论(Weak Generational Hypothesis):
    1 大部分新生成的对象将很快死去
    2 很少有从Old到Young的对象引用。
  这种分代方式在很多应用程序中广泛应用,且在减少垃圾回收暂停时间和总成本方面已被证明是非常有效的。
  Hotspot VM将堆空间划分为三个独立的空间:
  1 Young代
(1)当app创建对象的时候,这些对象首先会被分配到Young代空间中。
(2)空间小且回收频繁
(3)所选Young代的GC算法通常速度比较快,因为Young回收频率高。
  2 Old代
(1)存活时间长的对象最终“升级”到Old代
(2)通常比Young的对象大,且增长速度比较缓慢
(3)Old代GC的算法通常注重空间效率,因为old代占据了大部分的堆空间,所以GC算法必须要运行良好且具有比较低的垃圾回收密度。
  3 Permanent代
(1)保存VM和Java类的元数据以及interned字符串和类的静态变量
(2)注意Java8会把Permanent给移除掉。
2 minor & Full GC
  这三个空间中的某个满了并且需要额外的空间但没满足要求这时会发生GC现象。有两种GC:minor和full。当Young满了就会触发一个minor GC,surviving对象会被迁移到old。当old满了会触发full GC这个动作会涉及到整个对象堆。
  Minor GC:
   (1)当Young没有足够空间时会发生MinorGC。
   (2)相对full GC往往是短暂的
  Full GC:
   (1)当Old或者Perm满了时,full gc就会发生。
   (2)显式调用System.gc()时也可能会发生full GC。
   (3)GC时间长短取决于堆大小,然而,如果GC时长超过3至5秒或更长的时间,那么我们认为它的GC时间就过长了。
  其中Full GC的消耗时间最长,并且它是app不满足延时以及吞吐量需求的首要原因。简而言之GC调优的目标是减少full gc的数量跟频率。为了达到这个目标我们可以从两方面着手:
   (1)从系统方面
a) 在不影响系统内存与磁盘换页的情况下,应该使用尽可能多的堆内存。建议JVM使用80%的可用RAM(除去其他app或者系统占有的)。
        b) java堆越大,gc更好,app的吞吐量跟延迟表现会更佳。
  (2)从app方面
减少对象的分配,更为重要的是减少对象在内存的驻留将有助于降低内存中存活数据的大小,从而有助于GC和应用程序性能的提升。
3 OOME 
  OOME是每个程序猿都不希望看到的,但它确实会发生,特别是当你的app涉及大量数据的处理时。App的整个内存包括:
   (1)Java堆内存 (2)线程栈 (3)IO buffer (4)本地库分配的内存。
  如果app用完内存或者JVM gc时回收更多空间失败,OOME异常就会抛出。注意OOME并不意味着内存泄漏。问题可能是由一个配置问题引发,例如指定的堆大小(未指定的话默认堆大小)不满足app需要。
4 JVM 调优选项
  如果你的app堆比较小且gc花的时间比较长那么就该调整堆大小了。但我们不能把堆空间设置的太大,那样会影响系统其他程序的运行性能。
  GC调优并不简单。找出优化空间大小会涉及到迭代的过程。假定我们已经成功定位到所要优化的堆空间大小,那么我们就可以用JVM命令项来设置这些值。最常用的有:
  -Xms:设置初始和最小堆大小。例如-Xms512m
  -Xmx: 设置java堆最大大小
  -Xmn: 设置Young代大小。注意old代的大小将会基于Young代的值隐式设置。
  -XX:PermSize=<n>[g|m|k]: 设置PermSize
  -XX:MaxPermSize=<n>[g|m|k]:设置最大PermSize
分享到:
评论

相关推荐

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

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

    【java】10分钟,了解GC过程

    【java】10分钟,了解GC过程

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

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

    GC2053_1,2.9"GC2053sensor_格科微_GC2053_gc2053datasheet_galaxycore_

    通过AE-2M-3043_GC2053_CSP_Datasheet_Release_V11_20181212.pdf文档,我们可以深入了解GC2053的电气特性、接口规范、封装信息以及应用建议。 GC2053的封装方式是CSP(Chip Scale Package),这种封装技术可以减小...

    2019gc2000.rar

    首先,让我们深入了解GC-PowerStation的核心功能。SMT导坐标处理是其一大亮点,该功能允许用户导入并编辑各种SMT设备所需的贴片机坐标文件,如JDE、XLS、TXT等格式。用户可以通过软件直观地查看和调整坐标数据,确保...

    GC-Place软件及使用教程

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

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

    总之,优秀的Java程序员不仅需要掌握基础语法和面向对象的设计原则,还要深入了解GC的工作原理,以便在开发过程中做出明智的决策,提高程序的性能和资源利用率。通过不断学习和实践,可以减少GC带来的不确定性,实现...

    GC基本调优工具介绍

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

    Visual GC(监控垃圾回收器)

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

    AE-2M-3001 GC2023 CSP 模组设计指南_release_Rev1.0_20160401.pdf

    首先,我们要了解GC2023的基本参数。GC2023是一款彩色1/2.7英寸的CMOS图像传感器,拥有54PIN的CSP封装形式。它具有1920×1080像素的分辨率,支持1080P的视频录制,能够在低光照条件下提供良好的图像质量。 在设计...

    GC8870+说明书V1.0.pdf

    尽管文档中有些文字由于OCR扫描原因出现了一些识别错误或遗漏,但所提供的信息足以了解GC8870的功能、特性、管脚配置和应用场景。通过这些详细的技术参数,可以完成对GC8870的评估、选择和应用。

    深入理解JVM & G1 GC

    5. 监控与日志:开启`-XX:+PrintGCDetails`和`-XX:+PrintAdaptiveSizePolicy`,了解GC行为并进行调整。 在实际应用中,了解和掌握JVM的内存管理和G1 GC的工作机制,结合具体的应用场景进行适当的调优,可以显著提升...

    GC-PLACe操作步骤

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

    GC2053_CSP_datasheet.zip

    了解GC2053 CSP的数据手册后,开发者可以根据具体需求进行系统设计,包括电源设计、信号调理、接口电路设计等,以实现最佳的图像捕捉和处理效果。同时,考虑到GC2053的广泛应用领域,对这款传感器的理解和掌握也是...

    com-sun-tools-visualvm-modules-visualgc.zip

    3. **GC事件通知**:当发生GC时,VisualGC会进行提示,帮助开发者了解GC发生的频率和原因。 4. **内存分配追踪**:通过追踪对象的分配,可以发现可能存在的内存泄漏问题。 5. **对象生存周期分析**:分析对象从...

    JVM、GC详解及调优_jvm_JVM、GC详解及调优_

    2. **GC日志分析**:通过分析GC日志,了解GC行为,找出性能瓶颈。 3. **并行与并发设置**:调整并行GC线程数和并发GC策略,优化性能。 4. **对象存活率预估**:通过调整Survivor区比例,减少Full GC的发生。 5. **...

    gchisto - gc

    4. **GC次数的百分比**:这些百分比展示了GC操作相对于总运行时间的比例,可以帮助我们了解GC活动在应用运行中的活跃程度。 5. **GC消耗的时间**:GC操作所占用的总时间,这包括了所有类型GC(Young和Full)的时间...

    JAVA中对GC的理解

    Java中的GC,全称Garbage Collection,是一种自动的内存管理机制,主要负责回收不再使用的对象所占用...同时,了解GC的工作原理可以帮助开发者避免创建过多的短期对象,减少不必要的垃圾回收,从而提高系统的整体性能。

    C#垃圾回收机制GC

    5. 了解GC的工作模式,如Generational GC,它针对不同年龄的对象采取不同的回收策略。 6. 使用WeakReference避免阻止对象回收。 7. 注意内存压力,适时调整应用程序的行为以配合GC。 8. 了解GC的触发条件,如内存...

    GChisto GC日志分析工具

    GChisto是一个专门设计用于分析Java GC日志的工具,它可以帮助开发者深入了解GC活动,从而优化应用的性能。 **GC日志分析的重要性** Java的垃圾收集器在后台默默地工作,回收不再使用的对象,释放内存。虽然这个...

Global site tag (gtag.js) - Google Analytics