JAVA内存占用情况实验一_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > JAVA内存占用情况实验一

JAVA内存占用情况实验一

 2011/10/6 8:12:04  燈小嗨  http://dengxiaohai.iteye.com  我要评论(0)
  • 摘要:之前在公司听了一门撒迦的关于java内存占用方面的讲座,收获颇丰,回来后在eclipse下进行了一些简单的尝试,但是实验遇到了一些小小的问题,通过向大牛咨询和查资料的方式逐渐将这些问题解决了,现在将我在这些实验中遇到的问题,已经解决的方法和大家分享下,希望各位指点其中的错误,谢谢!Java环境:Javaversion"1.6.0_24"Java(TM)SERuntimeEnvironment(build1.6.0_24-b07)JavaHotSpot(TM
  • 标签:情况 Java

之前在公司听了一门撒迦的关于java 内存占用方面的讲座,收获颇丰,回来后在eclipse 下进行了一些简单的尝试,但是实验遇到了一些小小的问题,通过向大牛咨询和查资料的方式逐渐将这些问题解决了,现在将我在这些实验中遇到的问题,已经解决的方法和大家分享下,希望各位指点其中的错误,谢谢!

?

Java 环境:

Java version "1.6.0_24"

Java(TM) SE Runtime Environment (build 1.6.0_24-b07)

Java HotSpot(TM) Client VM (build 19.1-b02,mixed mode, sharing)?

?

设置JVM 启动参数为 -Xms12m -Xmx12m ,然后运行如下程序:

?

public class MemTest {

	public static void main(String[] args) {
		int[] intArray = new int[2*1024*1024];
	}

}
?

程序运行后出现

?

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
	at thread.ThreadCount.main(ThreadCount.java:6)
?

说明程序运行时堆内存溢出。

存在疑问:

? java 中,每个int 4 字节,这个int 数组共有2*1024*1024int 类型,那我们可以推断出这个int 数据占据了大约8M ,而且这些空间是在内存堆中开辟的。现在我们已设置好内存堆有12M 的空间,也就是说除去程序其他内存堆开销整个堆内存应该剩下将近4m ,但是此处运行后,程序发生内存堆不够的内存溢出。

疑问解答:

之所以遇到上面的问题是因为我们所使用的Java HotSpot(TM) 虚拟机是一种分代式的结构,其主要结构如下所示:

HotSpot Jvm内存堆结构

此种类型的GC 堆分成了三代,分别是Young GenerationOld GenerationTenured )、Permanent Generation

其中Young GenerationEdenS0S1 (就是图上说的survivorspaces 区)组成,它主要负责存放新生成的对象,当Eden 区满时,还存活的对象被复制到S0 ,当S0 满时,复制到S1 ,当S1 满时将从S0 复制过来的且存活的对象复制到Old Generation 。其中S0S1 两个区是对称的,没有先后关系,一个S 区中可能存在着从Eden 或是另一个S 区复制过来的对象,而只有从另一个S 区复制过来的数据才能继续复制到老年区。而

Old Generation 区中存放的从Young 区复制来的存活对象,都是生命周期较长的对象。

另外,Permanent Generation 对应着JVM 规范中的方法区,主要存放一些静态成员、常量,在HotPot VM 中可使用-XX:PermSize XX:MaxPermSize 对此区域进行调节。

在试验中新建的intArray 数组,需要连续的内存空间存储且一个对象不能跨代存储,也就是说,我们新建的对象大小不能超过了GC 堆中空间最大的一代,一般情况下,最大的代是Old Generation ,因此当intArray 数组对象为8M 时,可能已经超过了Old Generation 的大小,所以发生内存溢出异常

了解完HotSpot 的构造后,我们来看看为什么之前的代码会发生内存溢出。这个因为在试验中新建的intArray 数组,需要连续的内存空间存储且一个对象不能跨代存储,也就是说,我们新建的对象大小不能超过了GC 堆中空间最大的一代,一般情况下,最大的代是Old Generation ,因此当intArray 数组对象为8M 时,已经超过了Old Generation 的大小,所以发生内存溢出异常。

?

  • 大小: 23.6 KB
  • 查看图片附件
发表评论
用户名: 匿名