JAVA内存划分与管理

 

1.PC寄存器和JVM方法栈
每个线程均会创建PC寄存器和JVM方法栈,PC寄存器占用的可能是CPU寄存器或操作系统内存,JVM方法栈占用的为操作系统内存,JVM方法栈为线程私有,其在内存分配上非常高效。当方法运行完毕时,其对应栈帧所占用的内存也会自动释放。
这个区域会抛出两种异常,StackOverflowError和OutOfMemoryError。

2.Java堆
堆用于存储对象实例及数组值,可以认为Java中所有通过new创建的对象的内存都在此分配。Heap中对象所占用的内存由GC进行回收,在32位操作系统上堆内存最大为2GB,在64位操作系统上则没有限制。其大小可通过-Xms和-xmx来控制。
-Xms为JVM启动时申请的最小Heap内存,默认为物理内存的1/64但小于1GB。-Xmx为JVM可申请的最大Heap内存,默认为物理内存的1/4但小于1GB,默认当空余堆内存小于40%时,JVM会增大Heap到-Xmx指定的大小,可通过-XX:MinHeapFreeRatio=来指定这个比例;当空余内存大于70%时,JVM会减小Heap的大小到-Xms指定的大小,可通过-XX:MaxHeapFreeRatio=来指定这个比例,对于运行系统而言,为避免在运行时频繁调整Heap的大小,通常将-Xms和-Xmx的值设置成一样的。
为了让内存回收更加高效,Sun JDK1.2开始对堆采用了分代管理的方式。
1)新生代(New Generation)
  大多数情况下Java程序中新建的对象都从新生代分配内存,新生代由Eden Space和两块相同大小的Survivor Space(通常又称为S0和S1或from和To)构成,可通过-Xmn参数来指定新生代的大小。
2)旧生代(Old Generation)
 用于存放新生代中经过多次垃圾回收仍然存活的对象,例如缓存对象,新建的对象也有可能 直接在旧生代上直接分配
 内存。主要有两种情况(由不同的GC实现来决定):一种为大对象,可通过在启动参数上设置
 -XX:PretenureSizeThreshold=1024(单位为字节,默认为0)来代表当对象超过多大时就不在新生代上分配,而是直接在旧
 生代上分配,此参数在新生代采用Parallel Scavenge GC时无效,Parallel Scavenge GC会根据运行状况决定什么对象直接在
 旧生代上分配内存;另一种为大的数组对象,且数组中无引用外部对象。
 旧生代所占用的内存大小为-Xmx对应的值减去-Xmn对应的值。

3.方法区
方法区存放了要加载的类的信息(名称、修饰符等)、类中的静态变量、类中定义的final类型的常量、类中的Field信息、类中的方法信息、以及常量池,当开始人员在程序中通过Class对象的getName、isInterface等方法获取信息时,这些数据都来源于方法区域,方法区域是全局共享的,在一定条件下它也会被GC,当方法区域要使用的内存超过其允许的大小时,会抛出OutOfMemoryError错误。
在Sun JDK中这块区域对应Permanet Generation,又称为持久代。默认最小值为16MB,最大值为64MB,可通过
-XX:PermSize和-XX:MaxPermSize来指定最小值和最大值。

4.本地方法栈
本地方法栈用于支持native方法的执行,存储了每个native方法调用的状态,在Sun Jdk的实现中本地方法栈和JVM方法栈是同一个。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值