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

JVM GC浅谈

    博客分类:
  • jvm
阅读更多

jvm中的内存可以分为堆内存和非堆内存,其中堆内存用于存储虚拟机运行中产生的各种对象,而通常所说的GC也就是针对这一块内存而言的。作为开发者,我们并不需要去关心到底什么时候该调用GC去清理内存,因为jvm会帮我们打理好这一块。但是如果想深入了解java内存管理,就不得不关心下这块对程序员“透明”的区域了。

 

要了解GC过程,首先要说说堆内存是怎么工作的。java所创建的对象会都放在堆内存中,但随着新对象的逐渐加入,堆内存的剩余空间会越来越少。当无法给一个新的对象继续分配内存空间时,程序就会发生out of memory。我们知道,java程序员在编写时无需关心何时释放对象的内存,所以会有相当一部分的“垃圾”对象,即再也不会引用到的对象存在于内存中。当剩余空间不够时,jvm就会扫描堆内存找出垃圾对象,将其占用的内存释放掉,这就是GC。

 

jvm中的GC采用了generation算法,认为内存中的对象有这样的情形:大多数的对象存活的时间比较短,而少部分的对象才能够长时间存活。因此,jvm将堆内存划分为年轻代(young generation)和年老代(old generation)。年轻代中的对象通常建立时间不久,且大部分生命周期也很短;年老代中的对象则已经创建比较久了,其声明周期也相对年轻代比较长。按照上面的划分,jvm在做GC时也进行了区别对待,对年轻代GC会相对比较频繁,且采用了copying算法;年老代的GC相对比较少,且采用的是tracing算法的一种,是标记-清除-压缩。

具体结构如下图:

堆内存结构

Young Generation——当一个对象被创建时,需要给其分配内存。由于堆内存是所有java线程共享的,所以如果要分配一段内存空间就必须先对内存加锁,这样是很耗性能的,故如果对象所需内存小于某个值(好像是512个字节,我也忘了)直接从线程自己的缓存里分配。如果在Young Generation中分配内存的话,就通常是放在Eden(伊甸园区,不知道为啥取这个名字)中。这里就要介绍下Young Generation中内存的划分和使用了:

        Eden——所有新创建的对象都被放置在这里。

        Survivor——当Eden区空间不足时,会将其中依旧存活的对象拷贝到两块Survivor区域(FromSpace和                     ToSpace)中的一个,如果此时这个Survivor区域也空间不足,则将该块区域中存活的对象拷贝到另一块区域中。           注意,总有一个Survivor区域是空的。

对Young Generation的垃圾回收叫minor GC,通常很多的对象都活不过一次GC。

 

Old Generation——但一个Survivor区域满了的时候,会将该区域中已经历一定次数GC而依旧存活的对象放到Old Generation中。如果Old Generation也满了,那就要Full GC了。Full GC很耗性能,当Full GC进行时,应用程序会暂停。由于大部分对象都活不过一次GC,所以如果服务器上频繁的发生Full GC,就要关注下是不是出问题了。

 

Permanent Generation——这块区域我认为就是方法区,其作用就是用来存放java类、方法信息和常量池等。有的观点也将方法区看做是Permanent Generation,并看做堆内存一部分,这里就顺便介绍下。通常这块内存不会有什么太大的变动,当然如果采用了动态生成一些类的方式来设计应用程序,那么这块也需要设置较大一些用来放置新增的类。另外,由于常量池也放在这块区域里,所以如果常量池无限增大,理论上也会出现oom。也正因为这样,这块区域也会有GC,而且方式是Full GC。

 

上面就是jvm GC的一些信息。当然,开发人员也可以通过设置参数来影响jvm对内存的管理,下面就是一些常用的参数:

-Xmx——Heap区域最大值。默认为系统内存的1/4,不超过1G。

-Xms——Heap区域初始化时候的内存值。默认为系统的1/64,不超过1G。如果当前的空余堆内存比例小于40%(见-XX:MinHeapFreeRatio)系统会将堆内存扩大到最大值。通常-Xmx和-Xms设置为一样的值,免得内存来回变动损耗性能。

-XX:PermSize——设置方法区的内存初始值,通常为系统内存的1/64。

-XX:MaxPermSize——设置方法区的最大内存值,通常为系统内存的1/4。

-XX:MinHeapFreeRatio——设置Heap区域最小空闲值,用于控制何时将堆内存扩大至最大值,通常是40%

-XX:MaxHeapFreeRatio——设置Heap区域最大空闲值,用于控制何时将对内存缩小至初始值,通常是70%

-XX:NewRatio——设置Heap区域中new和old代大小的比例,值就是年轻代内存大小/年老代内存大小。

-XX:SurvivorRatio——设置Survivor区域和Eden区域的比例,值就是Eden区域大小/Survivor区域大小。

分享到:
评论

相关推荐

    JVM GC原理深入学习.pdf

    本文档可以作为学习JVM GC的工具书所使用,对于想深入学习JVM GC原理的同学,这一本书就足够了。因为本文档是作者花费数月时间,查阅GC相关的国内外众多资料并加以思路清晰的条目化而形成。因为篇幅所限,可能有部分...

    jvmgc过程介绍

    jvmgc过程介绍(jpg)

    java jvm调优浅谈

    java jvm调优浅谈

    JVM GC垃圾回收.pdf

    JVM GC垃圾回收.pdf

    jvm gc jvm调优 查看工具

    jvm gc jvm gc jvm调优 查看工具

    用于测试jvm gc调优-share-jvm-gc.zip

    用于测试jvm gc调优-share-jvm-gc

    JVM与GC调优课程视频

    JVM与GC调优课程视频 〖课程介绍〗: JVM与GC调优课程视频 〖课程目录〗: 1.笔记/ ├── 第1篇-字节码篇.png?x-oss-process=style/pnp8 ├── 第2篇-类的加载篇.png?x-oss-process=style/pnp8 ├── 第3篇-运行时...

    JVM_GC调优

    JVM_GC调优

    IBM JVM GC 技术文档

    英文版的IBM JVM GC的非常详细的技术文档,包括GC的原因分析,GC日志分析,GC过程分析

    JVM_GC_-调优总结.pdf

    JVM_GC_-调优总结

    java应用JVM的GC频率观察方法

    GC有两种类型:Scavenge GC(也称Young GC)和Full GC。 一般Full GC时,机器的Load会升高,应用也会停止响应一会(持续长达几秒),如果应用一直频繁的进行FullGC,一方面会出现应用无法提供正常服务,另一方面...

    jvm gc

    NULL 博文链接:https://bruce-king.iteye.com/blog/1991154

    JVM GC原理, heapsize调优

    详细介绍JVM gc原理, heapsize调优方法。 本文虽以IBM jdk为例讲解,但实际不仅限于于IBM jdk,其原理和方法同样适用于oracle jdk

    jvm 参数及gc详解

    jvm配置参数详解,以及Java gc详解

    浅谈jvm原理

    浅谈jvm原理(概念,运行机制,基本架构,运行时数据区,类加载系统,垃圾回收算法,垃圾回收策略,gc参数,调优策略)

    jvm和GC演讲ppt

    此文档是本人在公司做技术分享,个人做的ppt。如果有同学需要做jvm和gc技术演讲得,可以参考此文档。

    jvm和gc详解及调优

    java进阶必备书籍,高清版。带目录结构。方便阅读,书中内容讲的透彻

    jvmgc日志分析工具

    适用于jvm运行生成的gc日志文件可视化分析

    深入理解JVM&G1GC

    资源名称:深入理解JVM & G1 GC内容简介:G1 GC提出了不确定性Region,每个空闲Region不是为某个固定年代准备的,它是灵活的,需求驱动的,所以G1 GC代表了先进性。《深入理解JVM & G1 GC》主要为学习Java语言的...

Global site tag (gtag.js) - Google Analytics