一、JDK1.8 JVM内存模型概览

这里介绍的是JDK1.8 JVM内存模型。1.8同1.7比,最大的差别就是:元数据区取代了永久代。元空间的本质和永久代类似,都是对JVM规范中方法区的实现。不过元空间与永久代之间最大的区别在于:元数据空间并不在虚拟机中,而是使用本地内存

二、各区域介绍

1. 程序计数器

每个线程一块,指向当前线程正在执行的字节码代码的行号。如果当前线程执行的是native方法,则其值为null。

2. Java虚拟机栈


线程私有,生命周期与线程同进同退。每个Java方法在被调用的时候都会创建一个栈帧,并入栈。一旦完成调用,则出栈。所有的的栈帧都出栈后,线程也就完成了使命。

3. 本地方法栈

功能与Java虚拟机栈十分相同。区别在于,本地方法栈为虚拟机使用到的native方法服务。不多说。

4. 堆


堆是JVM内存占用最大,管理最复杂的一个区域。其唯一的用途就是存放对象实例:所有的对象实例及数组都在对上进行分配。1.8后,字符串常量池从永久代中剥离出来,存放在队中。堆有自己进一步的内存分块划分,具体划分请参见上图。

5. 元数据区

元数据区取代了1.7版本及以前的永久代。元数据区和永久代本质上都是方法区的实现。方法区存放虚拟机加载的类信息,静态变量,常量等数据。
元数据区OOM测试:

a. jvm参数配置

-XX:MetaspaceSize=8m -XX:MaxMetaspaceSize=50m
  • 1

b. 测试代码

public class MetaSpaceOomMock {public static void main(String[] args) {ClassLoadingMXBean loadingBean = ManagementFactory.getClassLoadingMXBean();while (true) {Enhancer enhancer = new Enhancer();enhancer.setSuperclass(MetaSpaceOomMock.class);enhancer.setCallbackTypes(new Class[]{Dispatcher.class, MethodInterceptor.class});enhancer.setCallbackFilter(new CallbackFilter() {@Overridepublic int accept(Method method) {return 1;}@Overridepublic boolean equals(Object obj) {return super.equals(obj);}});Class clazz = enhancer.createClass();System.out.println(clazz.getName());//显示数量信息(共加载过的类型数目,当前还有效的类型数目,已经被卸载的类型数目)System.out.println("total: " + loadingBean.getTotalLoadedClassCount());System.out.println("active: " + loadingBean.getLoadedClassCount());System.out.println("unloaded: " + loadingBean.getUnloadedClassCount());}}
}

c. 运行输出:

jvm.MetaSpaceOomMock$$EnhancerByCGLIB$$567f7ec0
total: 6265
active: 6265
unloaded: 0
jvm.MetaSpaceOomMock$$EnhancerByCGLIB$$3501581b
total: 6266
active: 6266
unloaded: 0
Exception in thread "main" net.sf.cglib.core.CodeGenerationException: java.lang.reflect.InvocationTargetException-->nullat net.sf.cglib.core.AbstractClassGenerator.generate(AbstractClassGenerator.java:345)at net.sf.cglib.proxy.Enhancer.generate(Enhancer.java:492)at net.sf.cglib.core.AbstractClassGenerator$ClassLoaderData$3.apply(AbstractClassGenerator.java:93)at net.sf.cglib.core.AbstractClassGenerator$ClassLoaderData$3.apply(AbstractClassGenerator.java:91)at net.sf.cglib.core.internal.LoadingCache$2.call(LoadingCache.java:54)at java.util.concurrent.FutureTask.run(FutureTask.java:266)at net.sf.cglib.core.internal.LoadingCache.createEntry(LoadingCache.java:61)at net.sf.cglib.core.internal.LoadingCache.get(LoadingCache.java:34)at net.sf.cglib.core.AbstractClassGenerator$ClassLoaderData.get(AbstractClassGenerator.java:116)at net.sf.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:291)at net.sf.cglib.proxy.Enhancer.createHelper(Enhancer.java:480)at net.sf.cglib.proxy.Enhancer.createClass(Enhancer.java:337)at jvm.MetaSpaceOomMock.main(MetaSpaceOomMock.java:38)
Caused by: java.lang.reflect.InvocationTargetExceptionat sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:498)at net.sf.cglib.core.ReflectUtils.defineClass(ReflectUtils.java:413)at net.sf.cglib.core.AbstractClassGenerator.generate(AbstractClassGenerator.java:336)... 12 more
Caused by: java.lang.OutOfMemoryError: Metaspaceat java.lang.ClassLoader.defineClass1(Native Method)at java.lang.ClassLoader.defineClass(ClassLoader.java:763)... 17 more

如果是1.7的jdk,那么报OOM的将是PermGen区域。

6. 直接内存

jdk1.4引入了NIO,它可以使用Native函数库直接分配堆外内存。

JDK1.8 JVM内存模型相关推荐

  1. 深入理解Java虚拟机:jvm内存模型jdk1.8

    深入理解Java虚拟机:jvm内存模型jdk1.8 一.程序计数器 使用PC寄存器存储字节码指令地址有什么作用?为什么使PC寄存器记录当前线程的执行地址? PC寄存器为什么会被设定为线程私有? 二.J ...

  2. JVM内存模型及垃圾收集策略解析(一)

    http://www.cnblogs.com/laoyangHJ/archive/2011/08/17/jvm_model.html JVM内存模型是Java的核心技术之一,之前51CTO曾为大家介绍 ...

  3. JVM—内存模型JMM

    原文作者:qzqanlhy1314 原文地址:jvm 内存模型 目录 一.jvm 内存模型划分 二.虚拟机栈 三.堆 四.元数据区域 五.直接内存 一.jvm 内存模型划分 根据JVM规范,JVM 内 ...

  4. 《深入理解Java虚拟机》读后总结(一)JVM内存模型

    基于Sun HotSpot JVM 直接上图: 从图中看到,JVM内存分为两个主要区域,一个是所有线程共享的数据区,一个是线程隔离数据区(线程私有) 线程隔离数据区 程序计数器(Program Cou ...

  5. 深入详解JVM内存模型与JVM参数详细配置

    本系列会持续更新. JVM基本是BAT面试必考的内容,今天我们先从JVM内存模型开启详解整个JVM系列,希望看完整个系列后,可以轻松通过BAT关于JVM的考核. BAT必考JVM系列专题 1.JVM内 ...

  6. 直通BAT必考题系列:深入详解JVM内存模型与JVM参数详细配置

    JVM基本是BAT面试必考的内容,今天我们先从JVM内存模型开启详解整个JVM系列,希望看完整个系列后,可以轻松通过BAT关于JVM的考核. BAT必考JVM系列专题 1.JVM内存模型 2.JVM垃 ...

  7. JVM内存模型与GC回收器

    1.JVM内存模型 JVM内存模型如上图,需要声明一点,这是<Java虚拟机规范(Java SE 7版)>规定的内容,实际区域由各JVM自己实现,所以可能略有不同.以下对各区域进行简短说明 ...

  8. JVM内存模型和类加载运行机制

    JVM内存模型和类加载运行机制 JVM内存模型 运行一个 Java 应用程序,必须要先安装 JDK 或者 JRE 包.因为 Java 应用在编译后会变成字节码,通过字节码运行在 JVM 中,而 JVM ...

  9. jvm 参数_一文带你深入了解JVM内存模型与JVM参数详细配置

    JVM基本是BAT面试必考的内容,今天我们先从JVM内存模型开启详解整个JVM系列,希望看完整个系列后,可以轻松通过BAT关于JVM的考核. 一.JVM内存结构 由上图可以清楚的看到JVM的内存空间分 ...

最新文章

  1. 编译安装PostgreSQL
  2. python获取数据库查询的元数据_Python数据库、MySQL存储引擎、使用分区表、更改表结构、获取数据库元数据...
  3. 计算机网络训练参考文献,学生实践论文,关于开放教育过程中计算机网络技术专业学生实践能力的培养相关参考文献资料-免费论文范文...
  4. Oracle11g与Oracle11gxe有什么区别
  5. Windows Server 2012 服务器之Web服务器
  6. 人如其名(退了51CTO的群)
  7. [ARM-assembly]-A64的load/store指令总结
  8. 一文直击Graph Embedding图表示学习的原理及应用
  9. ElasticSearch-Hadoop:从Hadoop到ElasticSearch索引产品视图计数和客户顶部搜索查询
  10. 勒索病毒入侵中国, Splunk建议网络立即进行区分和隔离设置
  11. 菜鸟CEO万霖:双11包裹量将继续增长 已建立更高效的物流枢纽
  12. 更改数据库表中有数据的字段类型NUMERIC(18,2)为NUMERIC(18,6)
  13. 公众号 多服务器配置_多账号公众号分享的素材如何采集以及一键分发?
  14. python网络编程01/网络协议
  15. 页面URL传递中文乱码
  16. Scala简介与Scala的下载安装
  17. 论山寨手机与Android 【6】MTK手机的基带芯片
  18. 【硬盘故障】硬盘只显示盘符,不显示容量,无法打开的解决方案
  19. 企业为什么会遭到DDoS攻击?被DDoS攻击该怎么办?
  20. 【2017NOIP普及组】T4:跳房子 试题解析

热门文章

  1. 使用 VSCode 插件生成漂亮的代码截图
  2. 超详细 erlang服务器之微信公众号被动解析用户消息(明文模式安全模式)
  3. 小白篇之ENC编码器的SRT协议多平台推流配置
  4. Unity报错:Setting the parent of a transform which resides in a Prefab......解决方案(强行设置)
  5. 【ETH】以太网----PHY芯片LAN8720A----电路原理图
  6. Ubuntu latex 编译时参考文献出错 I couldn‘t open style file IEEEtran.bst xxx: \bibstyle{IEEEtran : }
  7. Egret摄像机跟随
  8. 山西农信社计算机知识,2019山西农信社考试备考题库:计算机试题(15)
  9. SATA硬盘性能测试软件,轻松上6GBs 实测sata2/sata3性能差距
  10. 侠客与侠客精神:花总刘韧聊互联网江湖