【转】java堆内存

来源:http://www.blogjava.net/fancydeepin/archive/2013/09/29/jvm_heep.html

1 java堆内存

Java中的堆是JVM所管理的最大的一块内存空间,主要用于存放各种类的实例对象。

在Java中,堆被划分成两个不同的区域:新生代(Young)、老年代(Old)。新生代(Young)又被划分为三个区域:Eden、From Survivor、To Survivor。

这样划分的目的是为了使JVM能够更好的管理堆内存中的对象,包括内存的分配以及回收。

堆的内存模型大致为:
这里写图片描述

从图中可以看出:堆的大小 = 新生代 + 老年代。其中,堆的大小可以通过参数 -Xms、-Xmx来指定。

本人使用的是JDK1.6,以下涉及的JVM默认值均为该版本为准。

默认的,新生代(Young)与老年代(Old)的比例的值为1:2(该值可以通过参数-XX:NewRatio来指定),即:新生代(Young) = 1/3 的堆空间大小。老年代(Old) = 2/3 的堆空间大小。

其中,新生代(Young)被细分为Eden和Survivor区域,这两个Survivor区域分别被命名为From 和To,以示区别。

默认的,Eden:From:To = 8:1:1(可以通过参数-XX:SurvivorRatiuo来设定),即:Eden = 8/10 的新生代空间大小,From = To = 1/10 的新生代空间大小。

JVM每次只会使用Eden和其中的一块Survivor区域来为对象服务,所有无论什么时候,总是有一块Survivor区域是空闲着的。因此,新生代实际可用的内存空间为 9/10 (即90%)的新生代空间。

2 GC堆

Java中的堆也是GC收集垃圾的主要区域。GC分为两种:Minor GC、Full GC(或Major GC)。

Minor GC是发生在新生代中的垃圾收集动作,所以采用的是复制算法。
新生代几乎是所有Java对象出生的地方,即Java对象申请的内存以及存放都是在这个地方。Java中的大部分对象通常不需长久存活,具有朝生夕灭的性质。当一个对象被判定为“死亡”的时候,GC就有责任来回收掉这部分对象的内存空间。新生代是GC收集垃圾的频繁区域。

当对象在Eden(包括一个Survivor区域,这里假设是From区域)出生后,在经过一次Minor GC后,如果对象还存活,并且能够被另一块Survivor区域所容纳(上面已经假设为From区域,这里应为To区域,即To区域有足够的内存空间来存储Eden和From区域中存活的对象),则使用复制算法将这些仍然还存活的对象复制到另一块Survivor区域(即To区域)中,然后清除所使用过的Eden以及Survivor区域(即From区域),并且将这些对象的年龄设置为1,以后对象在Survivor区域每熬过一次Minor GC,就会将对象的年龄+1,当对象的年龄达到某个值时(默认是15岁,可以通过参数-XX:MaxTenuringThreshold来设定,这些对象就会成为老年代)。

但这也不是一定的,对于一些较大的对象(即需要分配一块较大的连续内存空间)则是直接进入到老年代。

Full GC 是发生在老年代的垃圾收集动作,所采用的是标记-清除算法。

现实生活中,老年代的人通常会比新生代的人“早死”。堆内存中的老年代(Old)不同于这个,老年代里面的对象几乎个个都是在Survivor区域中熬过来的,它们是不会那么容易就“死掉”的。因此,Full GC发生的次数不会有Minor GC那么频繁,并且做一次Full GC要比进行一次Minor GC 的时间更长。

另外,标记-清除算法收集垃圾的时候会产生许多的内存碎片(即不连续的内存空间),此后需要为较大的对象分配内存空间时,若无法找到足够的连续的内存空间,就会提前触发一次GC的收集动作。

3 JVM参数选项

jvm 可配置的参数选项可以参考 Oracle 官方网站给出的相关信息:http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html
下面只列举其中的几个常用和容易掌握的配置选项:

参数说明
-Xms初始堆大小。如:-Xms256m
-Xmx最大堆大小。如-Xmx512m
-Xmn新生代大小。通常为Xmx的1/3或1/4。新生代 = Eden + 2个Survivor空间。实际可用空间 = Eden + 1个Survivor,即90%。
-XssJDK1.5+ 每个线程堆栈大小为1M,一般来说如果栈不是很深的话,1M是绝对够用了的。
-XX:NewRatio新生代与老年代的比例,如 –XX:NewRatio=2,则新生代占整个堆空间的1/3,老年代占2/3。
-XX:SurvivorRatio新生代中 Eden 与 Survivor 的比值。默认值为 8。即 Eden 占新生代空间的 8/10,另外两个 Survivor 各占 1/10。
-XX:PermSize永久代(方法区)的初始大小,PermGen 即永久代 ( 方法区 ),它还有一个名字,叫非堆,主要用来存储由 jvm 加载的类文件信息、常量、静态变量等。
-XX:MaxPermSize永久代(方法区)的最大值
-XX:+PrintGCDetails打印 GC 信息
-XX:+HeapDumpOnOutOfMemoryError让虚拟机在发生内存溢出时 Dump 出当前的内存堆转储快照,以便分析用。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值