Java虚拟机:Java内存区域(运行时数据区域)

Java虚拟机:Java内存区域(运行时数据区域)

JVM 在执行 Java 程序时,会将内存划分为若干个不同的数据区域,不同的区域用途不同,创建和销毁时间也不相同。在 JDK1.8 版本之后对运行时数据区域做了些修改,下面我们分别来看看修改前后的内存区域是怎么样的。

1、JDK1.8之前的JVM内存区域如下图:

Java虚拟机:Java内存区域(运行时数据区域)

2、JDK8之后的JVM内存区域如下图:

Java虚拟机:Java内存区域(运行时数据区域)

3、各区域的的作用:

​​​​​​​(1)程序计数器:

当前线程执行的字节码的行号指示器,记录当前线程执行到程序的哪个位置,通过改变计数器的值,可以选取下一条需要执行的字节码指令。该区域是线程私有,是唯一一个不会发生OOM的区域。

(2)Java虚拟机栈:

描述 Java 方法执行的内存模型,每个方法执行时都会创建一个栈帧,用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每个方法从调用到执行完成,就对应着一个栈帧在虚拟机中入栈到出栈的过程。该区域线程私有,生命周期与线程的生命周期相同。

(3)本地方法栈:

本地方法栈的作用和虚拟机栈的作用非常相似,区别是本地方法栈则为Native方法服务,而虚拟机栈为执行java方法服务,该区域也是线程私有。

(4)Java堆:

用于存储对象实例,是占用内存最大的区域,可划分为新生代和老年代,新生代又可细分为 Eden区、From Survivor区、To Survivor区。

在 HotSpot 中,对象在堆内存布局分成三部分:对象头,实例数据,对齐填充。

① 对象头:包括两部分的信息:

  • 运行时数据:用于存储对象自身的运行时数据,如哈希码,GC代年龄,锁状态标志、线程持有的锁、偏向线程ID等。
  • 类型指针:即对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例。如果对象是一个Java数组,那对象头中还必须有一块用于记录数组长度的数据。

② 实例数据:是对象真正存储的有效信息,是在程序代码中所定义的各种类型的字段内容,相同宽度的字段会被分配到一起。

③ 对齐填充:并不是必然存在的,仅起着占位符的作用。

(5)方法区:

用于存储类信息,包括运行时常量池、静态变量、常量、即使编译后的代码(即class文件)等数据。与Java堆一样,该区域被所有线程共享。

JDK8 之前,Hotspot 中方法区的实现是永久代(Perm),JDK8 开始使用元空间(Metaspace),以前永久代所有内容的字符串常量移至堆内存,其他内容移至元空间,元空间直接在本地内存分配。

为什么要使用元空间取代永久代的实现?

(1)字符串存在永久代中,容易出现性能问题和内存溢出。

(2)类及方法的信息等比较难确定其大小,所以指定永久代的大小比较困难,太小容易出现永久代溢出,太大则容易导致老年代溢出。

(3)永久代会为 GC 带来不必要的复杂度,并且回收效率偏低。

参考文章:https://www.cnblogs.com/czwbig/p/11127124.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/114740.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • PHP导入excel数据到MYSQL

    这里介绍一个直接将excel文件导入mysql的例子。我花了一晚上的时间测试,无论导入简繁体都不会出现乱码,非常好用。PHP-ExcelReader,下载地址:http://sourceforge.

    2021年12月24日
  • django 视图_django admin视图

    django 视图_django admin视图视图家族drf的视图总共分为以下4个,对应4个源码文件views:视图类generics:工具视图mixins:视图工具集viewsets:视图集学习曲线我们学习视图,可以按照以下的曲线

    2022年7月29日
  • 计算机位移指令的作用,循环移位指令有什么作用?

    计算机位移指令的作用,循环移位指令有什么作用?循环移位指令将字节、字或双字中的各位向右或向左循环移动N位后,再送给指令的输出单元。循环移位是环形的,即被移出来的位将返回到另一端空出来的位(见图4-18)。带进位的右、左循环移位指令各位的数据与进位位一起(16位指令时一共17位)向右(或向左)循环移动n位。循环移位指令(1)16位节日彩灯的循环移位控制设计循环移位的16位彩灯控制程序,移位的时间间隔为1s,首次扫描时用M8002来设置彩灯的初…

    2022年5月27日
  • 图像降采样原理_降采样滤波

    图像降采样原理_降采样滤波转自:http://www.lofter.com/postentry?from=search&permalink=1cb3111d_6ee95871、先说说这两个词的概念: 降采样

    2022年8月2日
  • office 365 e5开发者_百度网盘5t不够用怎么扩容

    office 365 e5开发者_百度网盘5t不够用怎么扩容Microsoft365E5开发者扩容到5T1.进入网址https://admin.microsoft.com/Adminportal/Home?source=applauncher#/users找到活跃用户2.找到你的账户进入管理产品许可证3.点击OneDrive,再点击编辑4.点击修改为此用户最大空间…

    2022年9月8日
  • 仿微博php生成短网址

    htmlcodephpcode推荐:http://www.cnblogs.com/roucheng/p/3528396.html

    2021年12月27日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号