`
jobar
  • 浏览: 340802 次
  • 性别: 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的性能、如何与GC进行有限的交互,因为有一些应用程序对性能要求较高,例如嵌入式系统、实时系统等,只有全面提升内存的管理效率 ,才能提高整个应用程序的...

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

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

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

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

    什么是GC,GC是什么意思为什么要有GC

    什么是GC,GC是什么意思为什么要有GC,了解gc对内存的处理机制

    GC5004芯片介绍和编程比较详细的文档

    此文档为应用系统设计者了解 GC5004 提供关键说明,针对 GC5004 芯片在 寄存器设定及系统应用上给予指导,方便系统设计及调试工程师快速建立应用方 案和调试效果

    java 垃圾回收 机制详解

    经过半个世纪的发展,内存的动态分配与内存回收技术已经相当成熟,一切看起来都进入了“自动化”时代,那为什么我们还要去了解GC和内存分配呢?答案很简单:当需要排查各种内存溢出、内存泄漏问题时,当垃圾收集成为...

    成为JavaGC专家上(1)—深入浅出Java垃圾回收机制

    首先可以满足作为一名软件工程师的求知欲,其次,深入了解GC如何工作可以帮你写出更好的Java应用。这仅仅代表我个人的意见,但我坚信一个精通GC的人往往是一个好的Java开发者。如果你对GC的处理过程感兴趣,说明你...

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

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

    resin-jvm 调优

    打开-xx:+ printgcdetails开关,可以详细了解gc中的变化。打开-XX: + PrintGCTimeStamps开关,可以了解这些垃圾收集发生的时间,自jvm启动以后以秒计量。最后,通过-xx: + PrintHeapAtGC开关了解堆的更详细的信息。...

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

    NULL 博文链接:https://4ujava.iteye.com/blog/553867

    Java_GC垃圾回收调优指南

    让你对java gc 的工作原理有更深的了解 谢谢下载

    思维导图-详细了解JVM和GC过程

    NULL 博文链接:https://1358440610-qq-com.iteye.com/blog/2408052

    GC0307 datasheet 英文

    网上资料少,建议格科多整点资料放网上,好了解产品

    深入了解Java GC的工作原理

    下面小编就为大家带来一篇深入了解Java GC的工作原理。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    javascript 内存回收机制理解

    因此了解GC,可以加深对javascript垃圾回收机制的理解。 2.用局部变量和全局变量解释GC GC在回收内存时,首先会判断该对象是否被其它对象引用.在确定没有其它对象引用便释放该对象内存区域.因此如何确定对象不再被引用...

    【JVM和性能优化】2.垃圾回收器和内存分配策略

    文章目录内存回收引用计数法可达性分析浅谈引用强引用软引用弱引用虚引用方法区GC 算法标记-清除算法(Mark-Sweep)复制算法(Copying)标记-整理算法(Mark...为什么要了解GC(Garbage Collection)和内存分配策略 1、面

    JVM:GC机制

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

    hc_GC5H6A.exe

    快速查找文件、打开应用程序、局域网秒传文件、局域网聊天... 知识星球:火柴(原火萤酱)全部攻略 越了解,越上瘾 好软件有着上手慢的“优良传统” 功能过于丰富不太容易轻下定义

    性能测试总结之内存泄露和内存溢出

    内存的区域划分,了解GC回收机制;重点关注如何去监控和发现内存问题;  刚刚做完了一个项目的性能测试,“有幸”也遇到了内存泄露的案例,所以在此和大家分享一下。  主要从以下几部分来说明,关于内存和内存泄露、...

    Java虚拟机筑地篇之垃圾收集算法

    经过半个多世纪的发展,内存动态分配和内存回收技术已经相当成熟,一切看起来都进入了“自动化”时代,那我们为什么还要去了解GC和内存分配呢?答案很简单:当需要排查各种内存溢出、内存泄漏问题时,当垃圾收集成为...

Global site tag (gtag.js) - Google Analytics