JVM内存模型体系结构(更新)

JVM之JVM面试题整理(长期更新) 目录 1、详细介绍一下JVM内存模型 2、说一下JVM内存结构(Java内存结构/Java内存区域)、Java内存模型区别与关系 3、讲讲什么情况下会出现内存溢出,内存泄漏? 4、说说线程栈 5、JVM 年轻代到年老代的晋升过程的判断条件是什么呢? 6、JVM 出现 fullGC 很频繁,怎么去线上排查问题 7、类加载为什么要使用双亲委派模式,有没有什么场景是打破了这个模式? 8、... 阅读详情

JVM内存模型

框架图:
在这里插入图片描述
过程:首先通过编译器把 Java 代码转换成字节码,类加载器(ClassLoader) 再把字节码加载到内存中,将其放在运行时数据区(Runtime data area)的方法区内,而字节码文件只是 JVM 的一套指令集规范,并不能直接交给底层操作 系统去执行,因此需要特定的命令解析器执行引擎(Execution Engine),将 字节码翻译成底层系统指令,再交由 CPU 去执行,而这个过程中需要调用其他 语言的本地库接口(Native Interface)来实现整个程序的功能。

JVM包含两个子系统和两个组件,两个子系统为Class loader(类装载)、 Execution engine(执行引擎);两个组件为Runtime data area(运行时数据 区)、Native Interface(本地接口)。

  • Class loader(类装载):根据给定的全限定名类名(如: java.lang.Object)来装载class文件到Runtime data area中的method area。
  • Execution engine(执行引擎):执行classes中的指令。
  • Native Interface(本地接口):与native libraries交互,是其它编程语 言交互的接口。
  • Runtime data area(运行时数据区域):这就是我们常说的JVM的内 存。

类加载过程

在这里插入图片描述
类加载过程:加载>连接>初始化。连接过程⼜可分为三步:验证>准备>解析。
过程:

  1. 通过全类名获取定义此类的⼆进制字节流
  2. 将字节流所代表的静态存储结构转换为⽅法区的运⾏时数据结构
  3. 在内存中⽣成⼀个代表该类的 Class 对象,作为⽅法区这些数据的访问⼊⼝

面试拓展:

知道哪些类加载器?
JVM 中内置了三个重要的 ClassLoader,除了 BootstrapClassLoader 其他类加载器均由 Java 实现且
全部继承⾃ java.lang.ClassLoader :

  1. ClassLoader(启动类加载器) :最顶层的加载类,由C++实现,负责加载
    %JAVA_HOME%/lib ⽬录下的jar包和类或者或被 -Xbootclasspath 参数指定的路径中的所
    有类。
  2. ExtensionClassLoader(扩展类加载器) :主要负责加载⽬录 %JRE_HOME%/lib/ext ⽬录下
    的jar包和类,或被 java.ext.dirs 系统变量所指定的路径下的jar包。
  3. AppClassLoader(应⽤程序类加载器) :⾯向我们⽤户的加载器,负责加载当前应⽤classpath下
    的所有jar包和类。

双亲委派模型

双亲委派模型


运行时数据区

Java 虚拟机在执行 Java 程序的过程中会把它所管理的内存区域划分为若干个 不同的数据区域。**这些区域都有各自的用途,以及创建和销毁的时间,有些区域 随着虚拟机进程的启动而存在,有些区域则是依赖线程的启动和结束而建立和销 毁。Java 虚拟机所管理的内存被划分为如下几个区域:
在这里插入图片描述
不同虚拟机的运行时数据区可能略微有所不同,但都会遵从 Java 虚拟机规范, Java 虚拟机规范规定的区域分为以下 5 个部分:

  • 程序计数器(Program Counter Register):当前线程所执行的字节码的行号 指示器,字节码解析器的工作是通过改变这个计数器的值,来选取下一条需要执行的 字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能,都需要依赖这个 计数器来完成;
  • Java 虚拟机栈(Java Virtual Machine Stacks):Java虚拟机栈不存在垃圾回收,线程结束栈over保存栈针,保存8大变量+对象引用+实例方法; 下图为虚拟机栈中内容。

在这里插入图片描述

  • 本地方法栈(Native Method Stack):与虚拟机栈的作用是一样的,只不过虚 拟机栈是服务Java 方法的,而本地方法栈是为虚拟机调用 Native 方法服务的;
  • Java 堆(Java Heap):Java 虚拟机中内存大的一块,是被所有线程共享的,存放类、方法与常量。分为三个部分新生区、老年区以及永久区(1.8后改为元空间),GC主要发生在新生区以及老年区;
  • 方法区(Methed Area):用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译后的代码等数据。

面试拓展:
Java虚拟机栈、本地方法栈、程序计数器是线程私有。

OMM问题:内存满了。解决措施扩大JVM内存,如还出现OOM则说明代码有问题,分析内存。

本地方法栈中native关键字(联系volatile关键字的调用),凡是带了Native关键字的,说明java范围达不到,进入本地方法栈,调用本地方法库,拓展C++使用,融合不同的语言,JIN(本地方法接口)。
例如:在这里插入图片描述

对象

对象的创建、分配内存、定位


执行引擎

垃圾回收器(GC)

垃圾回收

CST电子枪仿真实战:从零搭建粒子追踪模型到磁场聚焦优化 本文提供了一份CST电子枪仿真实战指南,详细讲解了从零开始搭建粒子追踪模型的全过程。内容涵盖项目初始化、Track Solver求解器基础、几何建模、粒子源定义,并重点介绍了如何通过引入和优化静磁场(如聚焦线圈配置)来实现电子束的聚焦,帮助工程师高效预测和优化束流品质。 阅读详情

相关推荐

CCS安装教程图解说明:可视化步骤快速上手

通过清晰的图解步骤详解CCS安装过程,帮助新手快速掌握环境搭建。结合ccs安装教程与实际操作界面,每一步都直观易懂,大幅降低学习门槛,提升配置效率。

weixin_42611310的博客 963

【JVM】JVM内存模型(详细)

JVM内存模型(详细)

酷酷的馫博客 5万+

drm 之modes

#define _GNU_SOURCE #include <errno.h> #include <fcntl.h> #include <stdbool.h> #include <stdint.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/mman.h> #include <time.h&...

u012794472的专栏 3718

JVM内存模型

JVM内存模型包括:程序计数器、本地方法栈、虚拟机堆(线程)、线程栈、方法区(元空间),程序计数器、线程栈、本地方法栈是每个线程所独有的。 1. 线程栈 JVM的每一个线程对应一个线程栈,一个线程的每个方法会分配一块栈帧内存空间。栈帧中包含:局部变量表、操作数栈、动态链接和方法出口。 2. 本地方法栈 运行本地方法的空间,也就是native本地方法运行时的一块空间。3. 程序计数器 程序计数器是用于存放下一条指令所在单元的地址的地方。...

weixin_48268269的博客 4万+

5分钟搞定!用FunASR在本地快速部署达摩院Paraformer语音识别模型

本文提供了一份快速部署指南,教你如何在5分钟内利用FunASR工具包在本地电脑上启动达摩院Paraformer语音识别模型。Paraformer作为一款非自回归端到端模型,以其推理速度快、识别精度高的特点,结合FunASR的一键式模型加载和统一API,让开发者能轻松构建本地语音识别系统,极大降低了前沿AI技术的应用门槛。

q9w8e7r6t5的博客 605

利用RFIDIOt和NFC进行Hitag2密码暴力破解: Python代码实现

RFID即无线射频识别,是一种通信技术,可以通过无线电信号读取、捕获和保存终端上的信息。这项技术在物流、零售、医疗等领域有着广泛的应用。NFC即近场通信,是一种短距离的高频无线通信技术,允许电子设备之间进行非接触式点对点数据传输。Hitag2是一种常见的RFID标签,广泛应用于汽车防盗系统、门禁系统等。由于其安全性在过去被广泛认可,很多设备都采用了这种标签。但近年来随着密码破解技术的发展,Hitag2的安全性受到了一些挑战。

qq_38334677的博客 1561

2、JVM内存模型深度剖析与优化

JDK体系结构 Java语言的跨平台特性 JVM整体结构及内存模型 线程栈,执行一个线程一个方法就会把方法的局部变量、操作数栈、动态链接、方法出口 放到线程栈中。每个方法都有一个独立的栈帧内存空间。 javap -c (-v 常量池) code的编号就是程序计数器的数字。距离步骤见jvm操作指令 补充一个问题: 在minor gc过程中对象挪动后,引用如何修改? 对象在堆内部挪动的过程其实是复制,原有区域对象还在,一般不直接清理,JVM内部清理过程只是将对象分配指针移动

u011107814的专栏 290

lammps教程:FeNiCr合金多晶结构建模方法

大家好,我是小马老师。 本文介绍合金多晶模型的建模过程,使用的软件为Atomsk。 Atomsk是一个开源软件,可运行在windows、linux等多种操作系统上,本文使用windows版的Atomsk实现建模,其他操作系统的建模命令基本相同。 建模过程如下: 1. 生成单晶Fe晶胞 atomsk --create fcc 3.65 Fe Fe.xsf 2. 建立多晶节点文件polycrystal.txt 新建一个文本文件polycrystal.txt,文件内容为: box 200 100 200 ran

lammps_jiayou的博客 6658

​JVM第五讲 JVM内存结构

​JVM第五讲 JVM内存结构

程序员路同学 232

【Python进阶】VSCode Python开发完全指南:从环境配置到高效调试

本文通过15个实战案例,系统讲解VSCode进行Python开发的环境配置、编码技巧、调试方法及性能优化,帮助初学者快速构建专业开发环境。

赶紧的博客 3765

PyTorch深度学习实战(36)——Pix2Pix详解与实现

Pix2Pix 是基于生成对抗网络的图像转换框架,能够将输入图像转换为与之对应的输出图像,能够广泛用于图像到图像转换的任务,如风格转换、图像修复、语义标签到图像的转换等。Pix2Pix 的核心思想是通过对抗训练将输入图像和目标输出图像进行配对,使生成网络可以学习到输入图像到输出图像的映射关系。在本节中,将学习使用 Pix2Pix 根据给定轮廓生成图像。

盼小辉丶的博客 1万+

jvm内存模型和java内存模型

初识java虚拟机,就碰到一系列不懂的问题。我们以前常说java把局部变量放在栈里,new出来的变量放在堆里,然后堆里的数据不定时就给回收了。然后,如果是多线程的话,每个线程自己都有会一个私有的虚拟机栈,运行每个方法时都会创建一个栈帧,栈帧里存储着局部变量啦等信息,方法结束栈帧就出栈。这好像就是我们对java内存模型的第一次理解吧。直至今天,我看了java线程通讯之java内存模型,出现了主内存、...

番茄炒土豆的博客 9445

IgH EtherCAT 从入门到精通:第 30 章 实战:高可用 EtherCAT 系统设计

摘要:构建高可用EtherCAT系统的关键技术 本章详细介绍了工业级EtherCAT系统的高可用性设计方法,主要包括: 冗余链路架构:采用双网卡环形拓扑设计,主备网卡同时工作,通过IgH Master的冗余配置实现线缆故障自动切换。 状态监控机制:提供专用API实时监控主备链路状态,包括从站响应数、链路状态和冗余激活标志,形成完整的故障判断矩阵。 自动恢复功能:系统内置FSM架构支持热插拔自动检测和重配置,从站断线/重连时可自动完成状态恢复,同时允许应用层实施安全措施。 这些技术共同构成了生产环境下Ethe

从事嵌入式linux android驱动开发,拥有全栈能力 243

JVM内存模型与Java内存模型

博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家,WEB架构师,阿里云专家博主,华为云云享专家,51CTO 专家博主。

激流丶的博客 2452

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

彻底理解JVM内存模型

JVM内存模型。

西岭千秋雪的博客 2071

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

CPU内存模型、Java内存模型和JVM内存模型

CPU内存模型、Java内存模型和JVM内存模型

qq_40577332的博客 1583

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

13.JVM内存模型深度剖析

JDK代表Java Development Kit(Java开发工具包),是用于开发和编译Java应用程序的软件包。JDK是由Oracle提供的Java平台的官方实现,包含了开发和运行Java程序所需的工具、库和JRE(Java Runtime Environment)。

Csdn_xzh的博客 1388

jvm体系结构

在Hotspot虚拟机中,这块区域对应的是Permanent Generation(持久代),一般的,方法区上执行的垃圾收集是很少的,因此方法区又被称为持久代的原因之一,但这也不代表着在方法区上完全没有垃圾收集,其上的垃圾收集主要是针对常量池的内存回收和对已加载类的卸载。本地方法栈和虚拟机方法栈运行机制一致,它们唯一的区别就是,虚拟机栈是执行Java方法的,而本地方法栈是用来执行native方法的,在很多虚拟机中(如Sun的JDK默认的HotSpot虚拟机),会将本地方法栈与虚拟机栈放在一起使用。

weixin_57763462的博客 1525

JAVA内存模型!=JVM内存模型

有很多JAVA开发人员,在被问起:“你知道Java内存模型吗?”,都会回答:“知道,JAVA内存模型分为方法区、堆、…”。虽说“概念”这个词发明出来是为了方便交流和说明问题的,不用太过于较真。但是,答非所问就是你的不对了。如果对两者的概念混淆不清的,希望在看完本文后对你有所帮助。虽然JAVA内存模型!=JVM内存模型,但两者也有一定的关联。通过对JAVA内存模型的了解,能够对并发编程中存在的问题(可见性、原子性、有序性)有清晰的认识以及应对方案。

二蛋的博客 1005

JAVA内存模型与JVM内存结构

注意区分Java内存模型(Java Memory Model,简称JMM)与Jvm内存结构,前者与多线程相关,后者与JVM内部存储相关。本文会对两者进行简单介绍。

weixin_43681666的博客 3961

三、JVM内存模型深度剖析与优化

对象在堆内部挪动的过程其实是复制,原有区域对象还在,一般不直接清理,JVM内部清理过程只是将对象分配指针移动到区域的头位置即可,比如扫描s0区域,扫到gcroot引用的非垃圾对象是将这些对象复制到s1或老年代,最后扫描完了将s0区域的对象分配指针移动到区域的起始位置即可,s0区域之前对象并不直接清理,当有新对象分配了,原有区域里的对象也就被清除了。设置成一样的值,并设置得比初始值要大,对于8G物理内存的机器来说,一般我会将这两个值都设置为256M。默认2表示新生代占年老代的1/2,占整个堆内存的1/3。

Evan's Blog ٩(๑❛ᴗ❛๑)۶ 915

Java 内存模型 (Java Memory Model, JMM) 与 JVM 内存模型的区别

Java 内存模型 (Java Memory Model, JMM) 与 JVM 内存模型的区别

qq_36070104的博客 1373
上一篇: synchronized与CAS(更新)
下一篇: 双亲委派模型
香草星冰乐
博客等级 码龄7年 21粉丝 46原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值