JDK8中JVM堆内存划分

本文探讨了JVM内存的划分,重点关注JDK8中堆内存的改变。在JDK8之前,堆内存包括新生代、老生代和永生代,永生代用于存放元数据。JDK8将永生代移出堆内存,改用本地内存的Matespace,以减少`java.lang.OutOfMemoryError: PermGen`错误的发生。同时介绍了如何通过`-XX:MaxMetaspaceSize`参数调整元内存大小。
摘要由CSDN通过智能技术生成

一:JVM中内存的划分

JVM中内存通常划分为两个部分,分别为堆内存与栈内存,栈内存主要用于运行线程方法,存放本地暂时变量,存放线程中方法运行时需要的引用对象地址。

JVM全部的对象信息都存放在堆内存中。相比栈内存,堆内存所需空间大的多,所以JVM一直通过对堆内存划分不同的功能区块实现对堆内存中对象管理。

堆内存不够最常见的错误就是OOM(OutOfMemoryError)

栈内存溢出最常见的错误就是StackOverflowError。程序有递归调用时候最容易发生这种错误。

二:堆内存划分

在JDK7以及其前期的JDK版本号中。堆内存通常被分为三块区域:新生代内存(young generation)、老生代(old generation)、永生代(Permanent Generation for VM Matedata),例如以下图:

JDK8中JVM堆内存划分

 

上图中,最上一层是新生代内存,一个对象被创建以后首先被放到新生代中的Eden内存中,假设存活期超两个Survivor之后就会被转移到老生代内存中(Old Generation)中永生代内存中存放着对象的方法、变量等元数据信息。如果永生代内存不够,我们就会得到例如以下错误:java.lang.OutOfMemoryError: PermGen

而在JDK8中情况发生了明显的变化,就是普通情况下你都不会得到这个错误,原因

在于JDK8中把存放元数据中的永生代内存从堆内存中移到了本地内存(native memory)

中,JDK8中JVM

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值