JVM详解——内存结构

news2024/9/21 16:30:31

文章目录

  • 内存结构
    • 1、 运行时数据区
    • 2、虚拟机栈
    • 3、本地方法栈
    • 4、程序计数器
    • 5、 堆
    • 6、方法区
    • 7、运行时常量池
    • 8、内存溢出和内存泄漏
    • 9、 堆溢出

内存结构

在这里插入图片描述

1、 运行时数据区

Java虚拟机在运行Java程序期间将管理的内存划分为不同的数据区,不同的区域负责不同的职能,有各自的生命周期,这些区域统称为运行时数据区。

从线程私有和共享的角度区分:

线程私有: 程序计数器、Java虚拟机栈、本地方法栈

线程共享: 堆、方法区

栈是运行时的单位,而堆是存储的单位​。

栈解决程序的运行问题,即程序如何执行,或者说如何处理数据。堆解决的是数据存储的问题,即数据怎么放、放在哪。


2、虚拟机栈

作用: 虚拟机栈也称为Java栈,主要管理Java程序的运行,保存方法的局部变量、部分结果,并参与方法的调用和返回。

每个线程都有自己的栈,栈中的数据以栈帧的格式存在,一个线程上正在执行的每个方法都有自己对应的一个栈帧,方法调用栈帧压栈,方法结束栈帧弹出。

栈帧的内部结构

  • 局部变量表

主要用于存储方法参数和定义在方法体内的局部变量(包括基本数据类型和对象引用)

  • 操作数栈

主要用于保存计算过程的中间结果,同时作为计算过程中变量临时的存储空间,在方法执行过程中,根据字节码指令,往操作数栈中写入数据或提取数据,即入栈、出栈

  • 动态链接

指向运行时常量池的方法引用

在 Java 源文件被编译到字节码文件中时,所有的变量和方法引用都作为符号引用保存在 Class 文件的常量池中,动态链接的作用就是为了将这些符号引用转换为调用方法的直接引用

  • 方法返回地址

用来存放调用方法的PC寄存器的值

方法结束的两种方式:正常执行、出现异常,非正常退出

  • 一些附加信息

携带与Java虚拟机相关的一些附加信息,比如对程序调试提供支持的信息。


3、本地方法栈

本地方法栈就是Java调用非Java代码的接口,也就是Native Method​本地方法。

作用:与操作系统交互,Java应用有时候需要依赖一些底层系统的支持,比如在拷贝数组时候使用系统拷贝。


4、程序计数器

程序计数器是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器, 存储指向下一条指令的地址,即将执行的指令代码。

作用:CPU在切换线程时,JVM需要明确线程下一条应该执行什么字节码指令,而PC程序计数器中存储的就是下一条指令的地址,并且每个线程的执行进度不同,不同的线程需要有自己的PC程序计数器。


5、 堆

堆是Java虚拟机管理的内存中最大的一块,被所有线程共享。堆用来存放对象实例,几乎所有的对象实例以及数据都在这里分配内存。

堆也是垃圾回收的主要区域,为了高效的进行垃圾回收,虚拟机把堆内存在逻辑上划分为三块区域

  • 新生代: 存放新创建的对象和没达到一定年龄的对象
  • 老年代: 被长时间使用的对象,老年代内存更大
  • 元空间(JDK1.8之前称永久代):存放一些方法中的临时对象

Java 虚拟机规范规定,Java 堆可以是处于物理上不连续的内存空间中,只要逻辑上是连续的即可,像磁盘空间一样。实现时,既可以是固定大小,也可以是可扩展的,主流虚拟机都是可扩展的(通过 -Xmx​ 和 -Xms​ 控制),如果堆中没有完成实例分配,并且堆无法再扩展时,就会抛出 OutOfMemoryError​ 异常。

-Xmx: 堆的起始内存,默认初始化大小为 电脑内存/64

-Xmx​:堆的最大内存,默认初始化大小为 电脑内存/4


6、方法区

方法区是 JVM 规范中定义的一个概念,用于存储类信息、常量池、静态变量、JIT编译后的代码等数据,永久代是Hotspot虚拟机对方法区的实现(JDK8之后改为元空间)

JDK8 之前使用永久代实现方法区,容易内存溢出,因为永久代有 -XX:MaxPermSize ​​上限,即使不设置也有默认大小。JDK7 把放在永久代的字符串常量池、静态变量等移出保存到堆中,JDK8 中取消永久代,改用在本地内存中实现的元空间代替,把 类型信息、字段、方法、常量保存在本地内存的元空间中。


7、运行时常量池

运行时常量池是方法区的一部分,一个有效的class​字节码文件中除了包含类的版本信息、字段、方法以及接口等描述信息外,还包含常量池表,用于存放各种字面量和对类型、域和方法的符号引用,这部分内容将在类加载后存放到方法区的运行时常量池中。

运行时常量池,相对于 Class 文件常量池的另一个重要特征是动态性,Java 语言并不要求常量一定只有编译期间才能产生,运行期间也可以将新的常量放入池中。

比如:·String· 类的 intern()​ 方法,如果字符串常量池中存在对应得字面量,方法返回该字面量得地址;如果不存在,则创建一个对应得字面量放入运行时常量池,返回字面量地址。


8、内存溢出和内存泄漏

内存溢出OutOfMemory​,程序申请的内存超过JVM能够提供的内存大小,导致内存溢出,主要为堆内存溢出。

内存泄漏 Memory Leak​,无法释放已申请的内存,虚拟机不能再次使用该内存


9、 堆溢出

堆用于存储对象实例,只要不断创建对象并保证 GC Roots 到对象有可达路径避免垃圾回收,随着对象数量的增加,程序需要的内存空间就会超出JVM分配的内存空间导致OOM程序崩溃(例如在 while 死循环中一直 new 创建实例)。

出现堆OOM的情况:

  • 堆的内存大小设置不当
  • 程序中存在内存泄漏问题,或应用中有大量占用内存的对象,并且无法及时释放

解决方案:

  • -Xms -Xmx ​​修改堆的内存大小
  • 通过内存监控软件去查找程序中的泄漏代码

线上排查方式:

  1. 获取内存的dump文件(1. 配置JVM启动参数,当触发了OOM异常时自动生成 2. 使用jmap工具生成)
  2. 使用MAT工具分析dump文件
    • 如果是内存泄漏,可以查看泄漏对象的GC Roots的引用链,通过类信息和引用链信息定位到代码位置,进行解决
    • 堆空间分配不足以满足业务需求,提升堆内存空间


参考文章:
‍1. https://pdai.tech/md/java/jvm/java-jvm-struct.html
2. https://blog.csdn.net/weixin_45629285/article/details/128050932

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/377773.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[YOLO] yolo理解博客笔记

YOLO v2和V3 关于设置生成anchorbox,Boundingbox边框回归的过程详细解读 YOLO v2和V3 关于设置生成anchorbox,Boundingbox边框回归的个人理解https://blog.csdn.net/shenkunchang1877/article/details/105648111YOLO v1网络结构计算 Yolov1-pytorch版 …

ChatGPT修炼指南和它的电力畅想

近期,ChatGPT刷屏各大社交平台,无疑成为人工智能界最靓的仔! 身为一款“会说话”的聊天机器人程序,它与前辈产品Siri、小度、微软小冰等有什么不同?先来听听小伙伴们怎么说。 ChatGPT何以修炼得这么强大?…

什么叫骨传导概念耳机,骨传导耳机的原理是什么

骨传导耳机在蓝牙耳机当中是属于十分特殊传输声音的一种方式,开放式传输声音,其使用优点也受到越来越多人的熟知和喜爱,但还有一部分朋友们不知道骨传导耳机传输声音的原理是啥,下面就给大家简单科普一下。骨传导耳机是利用内置的…

BurpSuite实战教程03-BurpSuite插件开发

burp插件开发 Burp Suite的强大除了自身提供了丰富的可供测试人员使用的功能外,其提供的支持第三方拓展插件的功能也极大地方便使用者编写自己的自定义插件。,Burp Suite支持的插件类型有Java、Python、Ruby三种。无论哪种语言的实现,开发者…

华为造车锚定智选模式, 起点赢家赛力斯驶入新能源主航道

文|螳螂观察 作者| 易不二 近日,赛力斯与华为的一纸联合业务深化合作协议,给了频频猜测赛力斯与华为之间关系的舆论一个明确的定调:智选模式已成为华为与赛力斯共同推动中国新能源汽车产业高质量发展的坚定选择。 自华为智能汽车业务开启零…

【Java】TCP网络编程(字节/符流)

文章目录概念TCP网络编程ServerSocketsocket使用区别和原理演示概念 TCP(传输控制协议)是一种面向连接的协议,用于在计算机网络中可靠地传输数据。TCP是Internet协议族中的一个核心协议,它在传输层提供可靠、有序、基于流的传输服…

影视网络U盘系统开发思路

由于光纤入户千兆宽带的普及,在用户侧的下载速度得到前所未有的提高。与此同时,用户对于高清视频的需求日益增强,原有的视频点播系统在传输高清视频码流上时有卡顿现象发生,这严重影响了用户的娱乐体验。现时,大部分用…

IOS逆向之frida安装

首先手机要越狱,这个就不说了,博主就是咸鱼搞了个160的苹果6, 自己刷到苹果6支持最新的12.5.7版本后越狱; 谁让他低版本,不支持 CrackerXI砸壳呢,当时你要是使用 frida-ios-dump 也是可以的; …

【MySQL之SQL语法篇】系统学习MySQL,从应用SQL语法到底层知识讲解,这将是你见过最完成的知识体系

文章目录一、数据管理技术的三个阶段二、SQL语句学习1. DCL数据控制语言1.1 创建用户1.2 修改用户名1.3 修改密码1.4 删除用户1.5 授权1.6 查看权限1.7 回收权限2. DDL数据定义语言2.1 操作数据库2.2 操作数据表2.3 操作数据3. DQL数据查询语言基本语法3.1 单表查询3.1.1选择表…

Linux基础命令-ln创建链接文件

文章目录 ln 命令介绍 命令格式 基本参数 参考实例 1) 创建文件的硬链接 2)创建文件的软链接 3)创建链接文件时,相同目标文件创建备份文件 命令总结 ln 命令介绍 先看下帮助文档中的含义 NAME ln - make links …

HTML标签——表单标签

HTML标签——表单标签 目录HTML标签——表单标签一、input系列标签1.文本框(拓展)value属性和name属性作用介绍2.单选框3.复选框4.文件选择二、select下拉菜单标签三、label标签一、input系列标签 1.文本框 场景:在网页中显示输入单行文本的…

FL studio2023体验版及切换水果中文语言切换教程

FL studio2023提供了试用版本可供使用,功能和入门版的功能一样,但是有个缺点是不能够保存。只能当下做完,马上输出。入门版没有提供Audio音频编辑和录制的功能,建议要下手可以从完整版本去考虑。因为就算现在没有要录音&#xff0…

【Leedcode】栈和队列必备的面试题(第一期)

栈和队列必备的面试题(第一期) 文章目录栈和队列必备的面试题(第一期)一、题目二、思路(图解)三、存在的问题与隐患(报错提示)(1)s中只有右括号,无…

Capture Modules:车载网络报文捕获模块

(以下所有图片均来源于Technica官网) Technica Engineering的新一代硬件设备,即Capture Modules,提供了五种变体以涵盖不同带宽的车载以太网(100BASE-T1和1000BASE-T1)以及常见的IVN技术(CAN、C…

云原生架构基础概念及应用办法

什么是云原生? 云原生是一种基于容器、微服务和自动化运维的软件开发和部署方法。它可以使应用程序更加高效、可靠和可扩展,适用于各种不同的云平台。 如果要更直接通俗的来解释下上面的概念。 云原生更准确来说就是一种文化,是一种潮流&a…

modbus转profinet网关连接UV系列流量计程序实例

用户现场是西门子1200PLC通过兴达易控Modbus转Profinet网关连接流量计的配置,对流量瞬时值及报警值监控及控制程序案例 硬件连接兴达易控网关采用Profinet双网口,一端连接PLC、一端连接编程软件,单路485接口连接流量计,对流量值实…

mac使用sublime text卡顿解决方法,附常用快捷键

在mac上使用sublime text总是卡顿,比如选中一段文字复制,然后去干别的,等会回来点击空白处取消对文字的选择,点好多下都取消不了。 再比如修改tab格式也是改着改着就卡住了。 解决方法也很简单,打开sublime text的配置…

MIT:只需一层RF传感器,就能为AR头显赋予“X光”穿透视力

近年来,AR在仓库、工厂等场景得到应用,比如GlobalFoundries、亚马逊、菜鸟裹裹就使用摄像头扫描定位货品,并使用AR来导航和标记。目前,这种方案主要基于视觉算法,因此仅能定位视线范围内的目标。然而,在一些…

python基础—字符串操作

(1)字符串: Python内置了一系列的数据类型,其中最主要的内置类型是数值类型、文本序列(字符串)类型、序列(列表、元组和range)类型、集合类型、映射(字典)类型…

论文阅读 | Cross-Attention Transformer for Video Interpolation

前言:ACCV2022wrokshop用transformer做插帧的文章,q,kv,来自不同的图像 代码:【here】 Cross-Attention Transformer for Video Interpolation 引言 传统的插帧方法多用光流,但是光流的局限性在于 第一&…