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

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 谷歌 analytics.js 部分解密版

    谷歌 analytics.js 部分解密版源:http://www.google-analytics.com/analytics.js(function(){varaa=encodeURIComponent,f=window,ba=setTimeout,n=Math;functionPc(a,b){returna.href=b}functionfa(a,b){returna.name=b}varQc=”repla…

  • 将博客搬至CSDN

    将博客搬至CSDN

    2020年11月20日
  • 面试题springboot启动流程_Spring boot面试

    面试题springboot启动流程_Spring boot面试SpringBoot启动原理1、什么是SpringBoot2、SpringBoot启动原理3、三个关键注解解析3.1、@SpringBootConfiguration注解解析1、什么是SpringBootSpringBoot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。通过这种方式,SpringBoot致力于在蓬勃发展的快速应用开发领域(RapidApplication

  • npm 配置淘宝镜像[通俗易懂]

    首先解释一下npm为什么要配置淘宝镜像原因:因为node.js默认使用的是国外的网站。国内访问有一个跨国内局域网的操作。所以就会有时候很慢。这就跟为什么网站的静态资源有些会使用CDN加速一样的淘宝镜像是什么?就是npm很多的插件淘宝已经下载好了放在公共的网站上我们需要的时候去淘宝网上下载和国外的是一样这样使用是提升了我们的下载速度。所以淘宝镜像其实是一个国外插件的国内版本如何安装淘宝镜像配置1:淘宝npm地址:npmmirror…

  • centos7 本地yum源配置_centos官方yum源

    centos7 本地yum源配置_centos官方yum源准备上面三个文件。[root@localhost~]#yuminstall-ylibxml2-python-2.9.1-5.el7_0.1.x86_64.rpm[root@localhost~]#yuminstall-ycreaterepo-0.4.11-3.el5.noarch.rpm使用createrepo–version命令查看是否安装成功,出现…

  • HashMap底层数据结构原理解析[通俗易懂]

    HashMap底层数据结构原理解析[通俗易懂]老师:JDK中我们最常用的一个数据类是HashMap。那么,谁可以回答一下HashMap的底层数据结构原理是什么呢?小明:老师,我知道。众所周知,HashMap是一个用于存储Key-Value键值对的集合,每一个键值对也叫做Entry。这些个键值对(Entry)分散存储在一个数组当中,这个数组就是HashMap的主干。HashMap数组每一个元素的初始值都是Null。…

发表回复

您的电子邮箱地址不会被公开。

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