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


相关推荐

  • Django(59)验证和授权「建议收藏」

    Django(59)验证和授权「建议收藏」验证和授权概述Django有一个内置的授权系统。他用来处理用户、分组、权限以及基于cookie的会话系统。Django的授权系统包括验证和授权两个部分。验证是验证这个用户是否是他声称的人(比如用户名

    2022年7月31日
    6
  • Python基础语法知识点汇集「建议收藏」

    Python基础语法知识点汇集「建议收藏」本文小结了phython基础语法文章目录一.注释二.变量的类型三.标识符和关键字四.输出五.输入六.运算符七.数据类型转换一.注释<1>单行注释以#开头,#右边的所有文字当作说明,而不是真正要执行的程序,起辅助说明作用#我是注释,可以在里写一些功能说明之类的哦print(‘helloworld’)<2>多行注释”’我是多行注…

    2022年6月24日
    27
  • loadworkbook Python_load with

    loadworkbook Python_load withPython——load_workbook用法功能方法示例文件模块读取功能读取excel文件,并进行操作方法示例文件模块读取fromopenpyxlimportload_workbookwb=load_workbook(“电信成绩单.xlsx”)wb'<openpyxl.workbook.workbook.Workbookat0x1ad7ad45ac8>’ws=wb.activews<Worksheet”电子信息2班”>…

    2025年6月18日
    2
  • ubuntu命令行安装deb_ubuntu命令行安装deb软件

    ubuntu命令行安装deb_ubuntu命令行安装deb软件1、下载需要安装的deb包,输入以下命令安装:$sudodpkg-ipackage.deb2、查看package.deb包中的内容:$dpkg-cpackage.deb3、从package.deb包中提取信息:$dpkg-Ipackage.deb4、移除安装的deb包:$dpkg-rpackage5、…

    2022年10月21日
    3
  • Netty实战《原理》

    Netty实战《原理》Netty 介绍官网说明官网说明 1 netty 是由 JBOSS 提供的一个 java 开源框架 Netty 提供异步的 基于事件驱动的网络应用程序框架 用于快速开发高性能 高可靠的网络 IO 程序 2 netty 可以帮助你快速 简单的开发一个网络应用 相当于简化和流程化 NIO 的开发流程 3 netty 目前最流行的 NIO 框架 在互联网 大数据分布式计算领域 游戏行业 通信行业等有广泛的应用 知名的 Es Dubbo 等框架内部都采用 nettyc 官网说明

    2025年7月17日
    4
  • QT 实现 RTSP 视频流服务器[通俗易懂]

    QT 实现 RTSP 视频流服务器[通俗易懂]uos操作系统中使用QT开发RTSP视频流服务器,以下的实现方式使用的是单播方式。可以通过自己开发的rtsp服务器将摄像头的数据推送到服务器中,其他用户可以通过访问视频流地址,直接访问摄像头的内容,也就是通常说的摄像头直播。本篇文章使用开源框架live555开发一个属于自己的视频流服务器。

    2022年10月20日
    4

发表回复

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

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