初探JVM堆内存

来源:互联网 发布:易娱网络海外部 编辑:程序博客网 时间:2024/05/03 12:57
java虚拟机在运行Java程序的时候会将其内存划分为好几个不同的数据区域。

对大多数应用来说,堆内存应该是虚拟机管理的内存中最大的一块。java堆是可以被线程共享的区域,几乎所有的对象都在堆上进行内存空间的分配.


堆内存被划分成3块: 
1.永久代 JVM的方法区
用于存放静态类型数据,该块对垃圾回收没有什么影响。
2.新生代
所有新建的对象首先存放在新生代,目的在与尽快回收那些生命周期短的对象。
新生代主要由Eden和Survivor Space构成, 大小统过-Xmn指定, 一般将Survivor区分成S1,S2两块。Eden与Survivor Space的默认比例为8:1:1, 可以通过-XX:SurvivorRatio指定。
3.老年代
在新生代中经历了N个周期还没被回收的对象就会被复制到老年代,因此可以认为存放的都是一些生命周期较长的对象。


当对象在新生代存活次数超过上限时(可通过-XX:MaxTenuringThreshold配置, 对象存活的次数)就会被复制到老年代。相当于是Eden+某个S中存活下来的对象大于另一个S中的空间, 新生代中的对象就会被复制到老年代。


根据Java虚拟机规范的规定,Java堆可以处于物理上不连续的内存空间中,只要逻辑上是连续的即可。在JVM运行时,可以通过配置以下参数改变整个JVM堆的配置比例。


1.JVM运行时堆的大小


  -Xms堆的最小值


  -Xmx堆空间的最大值


2.新生代堆空间大小调整


  -XX:NewSize新生代的最小值


  -XX:MaxNewSize新生代的最大值


  -XX:NewRatio设置新生代与老年代在堆空间的大小


  -XX:SurvivorRatio新生代中Eden所占区域的大小


3.永久代大小调整


  -XX:MaxPermSize
不管以什么形式来划分堆,其储存的都是对象实例,划分的目的也是为了更好的回收内存或更快的分配内存。


0 0
原创粉丝点击