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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • pyqt5安装配置_如何安装pyqt5安装包

    pyqt5安装配置_如何安装pyqt5安装包上篇介绍了Python的安装:PyQt5教程(一)——Python的安装,本篇介绍PyQt5的安装。一、安装PyQt5:1、方法一:使用pip命令在线安装。输入以下命令可以直接安装:pipinstallPyQt5由于安装默认使用国外的镜像,可能因为网络问题会导致下载慢或者失败的现象。所以我们可以使用国内的镜像,比如豆瓣提供的镜像。只需要加上“-ihttps://pyp…

    2025年5月30日
    10
  • 前端框架bootstrap和layui有什么区别

    前端框架bootstrap和layui有什么区别做前端的小伙伴肯定都用过或听过Bootstrap和LayUi,小编我虽然不是专业的前端程序员,但是对于前端还是颇有研究,闲暇事情会经常研究各种前端框架的源码,一来可以借鉴优秀框架的思想,二来可以顺便学习可以提高自己,好了,不废话了。web前端全栈资料粉丝福利(面试题、视频、资料笔记、进阶路线)先看百度Bootstrap的定义Bootstrap是美国Twitter公司的设计师MarkOtto和JacobThornton合作基于HTML、CSS、JavaScript开发的简洁、直观、强悍的前端

    2022年6月25日
    47
  • 使用树莓派实现的口罩检测

    使用树莓派实现的口罩检测基于树莓派3B+官方摄像头两个指示灯实现的口罩检测项目演示链接口罩检测项目地址使用的口罩检测项目是AIZOO团队实现的使用的是目标检测常用的SSD算法。(由于疫情在家连不上实验室的服务器我无法训练)项目GitHub链接AIZOO团队给出的代码在Windows上很容易以跑通。配置的环境相对比较容易。也不需要很复杂的更改代码。因为模型较小我想出要在树莓派上运行,就进行了一些尝试。但是要在树莓派上运行需要修改一些代码。树莓派配置参考链接有很多基础配置对树莓派进行换源.

    2022年6月5日
    136
  • Python的包管理工具Pip

    Python的包管理工具Pip

    2021年12月15日
    44
  • java防止接口重复请求_前端防止重复提交

    java防止接口重复请求_前端防止重复提交PopularMVC框架接口防重复提交功能使用示例简介1、简介此项目用于演示如何使用popularmvc提供的接口防重复提交功能。使用防重提交功能,只需要在需要防重的接口上添加@RequiredNoRepeatSubmit注解即可。主要有以下内容:防重复提交码模式自定义防重复提交码自定义防重复提交码需要调用者保证防重复提交码的全局唯一性,推荐结构:userId+timestamptimestamp在数据更新后才允许更新使用sign作为防重码如果接口开启了数字签

    2022年9月1日
    5
  • DHCP协议简述

    DHCP协议简述DHCP(DynamicHostConfigurationProtocol,动态主机配置协议)是一个局域网的网络协议,使用UDP协议工作,主要有两个用途:给内部网络或网络服务供应商自动分配IP地址,给用户或者内部网络管理员作为对所有计算机作中央管理的手段,在RFC2131中有详细的描述。DHCP有3个端口,其中UDP67和UDP68为正常的DHCP服务端口,分别作为DHCPServer…

    2022年5月24日
    46

发表回复

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

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