虚拟机系列 | JVM运行时数据区

腾讯一面:如何用一段代码证明JVM加载类是懒加载模式? 假如有一天,你要找工作,等到了面试邀请,来到了面试公司,做完了笔试题,迎来了面试官。 阅读详情

 

1、内存结构

内存是计算机的重要部件之一,它是外存与CPU进行沟通的桥梁,计算机中所有程序的运行都在内存中进行,内存性能的强弱影响计算机整体发挥的水平。JVM的内存结构规定Java程序在执行时内存的申请、划分、使用、回收的管理策略,通说来说JVM的内存管理指运行时数据区这一大块的管理。

 

2、线程运行

JVM中一个应用是可以有多个线程并行执行,线程被一对一映射为服务所在操作系统线程,调度在可用的CPU上执行,启动时会创建一个操作系统线程;当该线程终止时,这个操作系统线程也会被回收。

 

在虚拟机启动运行时,会创建多个线程,数据区中有的模块是线程共享的,有的是线程私有的:

 

线程共享:元数据区、堆Heap;

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

单个CPU在特定时刻只能执行一个线程,所以多线程通过几块空间的使用,然后不断的增强CPU的执行时间段。

二、元数据空间

基本描述

方法元空间(方法区)在JVM启动的时候被创建,是被各个线程共享的内存空间,用于存放类和方法的元数据以及常量池,比如Class和Method。

在实际的开发中,经常因为加载的类太多,进而导致内存溢出问题,这样可以对元空间的大小进行扩展。

与堆的关系

 

元空间存放加载的类信息,当类被实例化时,堆中存储实例化的对象信息,并且通过对象类型数据的指针找到类。

三、堆空间

基本描述

JVM启动时创建堆区,是内存管理的核心区,通常情况下也是最大的内存空间,是被所有线程共享的,几乎所有的对象实例都要在堆中分配内存,所以这里也是垃圾回收的重点空间。

堆栈关系

 

栈是JVM运行时的单位,堆是存储单位,当栈中方法结束,相关对象失去所有引用后,不会马上被移除堆空间,要等到垃圾收集器运行的时候。

四、虚拟机栈

虚拟机栈(Java栈)在每个线程创建时都会生成一个虚拟机栈,栈的内部是一个个栈帧单元,对应Java方法的调用,其生命周期和线程周期保持一致。用来存储方法的局部遍历,部分执行结果,方法的调用和返回。

 

栈帧是方法执行的数据集,维持执行过程中的各种数据信息,执行的方法依次入栈,栈顶存放当前要执行的方法,执行结束后出栈,对于栈没有垃圾回收问题。

五、程序计数器

基本描述

JVM中程序计数寄存器用来存储下一条将要执行指令的地址,执行引擎获取到指令后进行执行,是线程私有的。它可以看作是当前线程所执行的字节码的行号指示器。

 

前后关系

线程在获取CPU的时间段内执行代码,但是线程随时可能没有执行完就被挂起,等到线程A再次获取CPU执行时,CPU 得知道执行到线程A的哪一个指令,程序计数器会存储该动作。

六、本地方法栈

本地方法栈与虚拟机栈所起到的作用是类似的,虚拟机栈为虚拟机执行Java方法,本地方法栈管理虚拟机使用到的 本地方法,在虚拟机规范中对本地方法栈中方法使用的语言、使用方式与数据结构并没有强制规定,因此具体的虚拟机可以自由实现它。HotSpot虚拟机直接就把本地方法栈和虚拟机栈合二为一。

Java面试总结,Redis宕机数据丢失解决方案,看完这篇彻底明白了 一、前言 长文警告,事实上我不愿意写太长的文章,一面是太冗余,一方面读者容易疲倦,但是只要是涉及到源码级别的,就肯定篇幅不短,因为太短肯定没意义也解释不清楚,但是相信,耐心看完这个文章一定会对Spring源码有所收获! 最近有很多读者面试的时候都被问到了有关于Spring三级缓存的解决方案,很多读者在面试受挫之后,试着自己去读源码,试着去跟断点又发现一层套一层,一会自己就懵了,我这几天总结了一下,为了能够让读者更加的去了解Spring解决循环依赖问题,我决定从以下四个方面去讲述: 什么是循环依赖 如果 阅读详情

相关推荐

Docker升级后重启容器出现错误:未知的运行时docker-runc

总之,升级Docker后重启容器出现"Unknown runtime specified docker-runc"错误是因为新的Docker版本与旧的运行时不兼容所导致的。通过删除旧的运行时并重新安装最新的docker-runc,并确保Docker配置文件中正确指定了所需的运行时,我们可以解决这个问题。其中一个常见的错误是"Unknown runtime specified docker-runc",指明了未知的运行时docker-runc。首先,我们需要确定当前系统上已安装的Docker版本和运行时。

DevScribe的博客 702

堆栈溢出的原因

jvm内存溢出

weixin_41011482的博客 2166

别再混淆了!一文彻底搞懂STM32的BootROM、BootLoader和启动模式(附启动流程图)

本文深入解析STM32的启动机制,详细讲解BootROM、BootLoader与启动模式的区别与联系,并提供实战指南。通过清晰的启动流程图和配置示例,帮助开发者彻底理解STM32启动流程,解决常见的启动问题,提升嵌入式开发效率。

weixin_33728268的博客 538

如何使用Java进行桌面应用的开发?

选择GUI框架:Java提供了两个主要的桌面GUI框架:JavaFX和Swing。JavaFX是Oracle推荐的最新的桌面应用开发框架,而Swing是一个老牌的桌面应用开发框架。配置开发环境:在你选择的集成开发环境(IDE)中配置JavaFX或Swing的开发环境。安装Java开发工具包(JDK):首先,确保你已经安装了Java开发工具包(JDK),并正确配置了环境变量。添加事件处理:为界面中的元素添加事件处理逻辑,例如按钮的点击事件等。编写业务逻辑:根据你的应用需求,编写Java代码实现业务逻辑。

2301_78263023的博客 5864

ADS 2023 实战:手把手教你仿真一个中心频率 2.4GHz 的带通滤波器(附工程文件)

本文详细介绍了使用ADS 2023软件设计和仿真中心频率2.4GHz带通滤波器的全流程,包括工程准备、指标定义、原理图设计、仿真优化及实际电路实现。通过切比雪夫滤波器拓扑和参数优化,实现高性能的带通滤波器设计,适用于无线通信系统。附有工程文件和常见问题解决方案,助力工程师快速掌握射频滤波器设计技巧。

weixin_30790841的博客 482

Android MediaCodec学习笔记

模块介绍 基本概念 OpenMAX是Khronos Group提出的标准,目标在于创造一个统一的接口,加速大量多媒体资料的处理。OpenMAX分成三层:应用层(Application Layer, AL), 整合层(Integration Layer, IL) 以及开发层(Development Layer, DL)。 OpenMAX (Open Media Acceleration) OpenMAX AL Application Layer ..

kisshine 2358

Java 虚拟机系列一:一文搞懂 JVM 架构和运行时数据区

前言 之前写博客一直比较随性,主题也很随意,就是想到什么写什么,对什么感兴趣就写什么。虽然写起来无拘无束,自在随意,但也带来了一些问题,每次写完一篇后就要去纠结下一篇到底写什么,看来选择太多也不是好事儿,更重要的是不成体系的内容对读者也不够友好。所以以后的博客尽量按系列来写,不过偶尔也会穿插其他的内容。接下来一段时间我会把写博客的重点放在 JVM (Java Virtual Machine) 和 ...

IamHYN的博客 1467

RseQC实战指南:从安装到RNA-Seq数据质控全流程解析

本文提供了一份详尽的RseQC实战指南,涵盖从安装配置到RNA-Seq数据质控的全流程。文章重点解析了RseQC作为专业质控工具的核心价值,手把手指导如何通过Conda或pip完成安装,并深入讲解了bam_stat.py、geneBody_coverage.py等关键模块的使用方法与结果解读技巧,帮助用户有效评估RNA完整性、文库构建质量及链特异性,确保下游分析的可靠性。

weixin_29200741的博客 201

java中判断undefined_Java虚拟机系列一:一文搞懂 JVM 架构和运行时数据区

前言之前写博客一直比较随性,主题也很随意,就是想到什么写什么,对什么感兴趣就写什么。虽然写起来无拘无束,自在随意,但也带来了一些问题,每次写完一篇后就要去纠结下一篇到底写什么,看来选择太多也不是好事儿,更重要的是不成体系的内容对读者也不够友好。所以以后的博客尽量按系列来写,不过偶尔也会穿插其他的内容。接下来一段时间我会把写博客的重点放在 JVM (Java Virtual Machine...

weixin_26854555的博客 188

实战解析:如何用Python逆向破解FastMoss的TikTok数据加密签名(附完整代码)

本文详细解析了如何用Python逆向破解FastMoss平台的TikTok数据加密签名机制,包括MD5加密算法和JS逆向分析。通过完整的Python代码示例,帮助开发者理解签名生成原理并实现自动化请求,提升数据获取能力。

weixin_30955617的博客 557

PHP实战:5分钟搞定SM4国密加密算法集成(附完整代码)

本文详细介绍了如何在PHP项目中快速集成SM4国密加密算法,提供完整的代码实现和实际应用示例。从算法原理到核心代码解析,再到性能优化与安全实践,帮助开发者高效实现数据加密功能,满足金融、政务等领域的合规需求。

weixin_29315569的博客 354

Java 虚拟机系列一:一文搞懂 JVM 架构和运行时数据区 (内存区域)

前言 了解 JVM 是对 Java 开发人员的基本要求,JVM 的相关内容自然也成了现在 Java 程序员面试的重要考点。不过估计很多小伙伴和我一样,长时间醉心于 CRUD,却忘了去了解一下更底层、更基础的东西,殊不知这些才是决定你能在这条路上走多远的关键因素,那接下来我们就一起来深入学习一下看似神秘的 JVM 吧。JVM 总体来看内容还是很多的,我会把最重要的内容介绍给大家,不过如果你有时间和精力的话,还是推荐你去看一下《深入理解Java虚拟机》这本书,确实是有口皆碑。本系列文章也会引用很多此书的内容并

wdquan19851029的专栏 449

Vision-Language Navigation - Windows环境下编译安装Matterport3D Simulator仿真器(三)

目录1 编译 Matterport3D Simulator 源码1.1 源码下载1.2 编译 1 编译 Matterport3D Simulator 源码   在 Windows 下编译 Matterport3D Simulator 稍微有些不方便,需要对 CMakeLists.txt 进行一些修改,如果有更好的方法欢迎大家评论。 1.1 源码下载   还是直接在 Github 上搜索 Matterport3D Simulator 的 repo,下载源码。如果用 zip 方式,那么直接在下即可。如果使用

weixin_44110393的博客 4845

Java虚拟机系列一:一文搞懂 JVM 架构和运行时数据区

前言之前写博客一直比较随性,主题也很随意,就是想到什么写什么,对什么感兴趣就写什么。虽然写起来无拘无束,自在随意,但也带来了一些问题,每次写完一篇后就要去纠结下一篇到底写什么,看来选择太...

320

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

JVM从零到一系列:03--运行时数据区【PC寄存器,虚拟机栈】

0x01.运行时数据区概述 1.运行时数据区模型图(整体图) 2.运行时数据区模型图(详情图) 3.概述 Java虚拟机定义了若干程序运行期间会使用到的运行时数据区: 有一些会随着虚拟机的启动而创建,随着虚拟机退出而销毁。 还有一些与线程一一对应,与线程对应的数据区会随着线程的开始和结束而创建和销毁。 独立的线程:【程序计数器,栈,本地栈】 共享的线程:【堆,堆外内存,方法区】 Java虚拟机与线程: 线程是一个程序运行的单元,JVM允许一个应用有多个线程。 HotSpot中,每个线程都与

ATFWUS的博客 3万+

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

JVM虚拟机学习系列之三(Java虚拟机的运行时数据区子系统、程序计数器、虚拟机栈)

目录 1、JVM虚拟机学习系列之一(Java虚拟机的发展史和java发展重大事件) 2、JVM虚拟机学习系列之二(Java虚拟机的内部结构、整体框架、类加载子系统、双亲委派机制) 3、JVM虚拟机学习系列之三(Java虚拟机的运行时数据区:程序计数器+虚拟机栈+局部变量表) 4、JVM虚拟机学习系列之四(Java虚拟机的字节码与类的加载) 5、JVM虚 前言 学习完本章,你会学到什么是Java虚拟机的运行时数据区、程序计数器、虚拟机栈、局部变量表等。 一、虚拟栈的位置结构图 二、什么是

qq_28245087的博客 539

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

JVM系列-虚拟机栈(运行时数据区)

虚拟机栈 简介 虚拟机栈的出现背景 由于跨平台性的设计,Java的指令都是根据栈来设计的。不同平台CPU架构不同,所以不能设计为基于寄存器的【如果设计成基于寄存器的,耦合度高,性能会有所提升,因为可以对具体的CPU架构进行优化,但是跨平台性大大降低】。 优点是跨平台,指令集小,编译器容易实现,缺点是性能下降,实现同样的功能需要更多的指令。 内存中的栈与堆 首先栈是运行时的单位,而堆是存储的单位。 即:栈解决程序的运行问题,即程序如何执行,或者说如何处理数据。堆解决的是数据存储的问题,即数

weixin_47277897的博客 176

【jvm系列-03】精通运行时数据区私有区域---虚拟机栈、程序计数器、本地方法栈

精通jvm运行时数据区私有区域

zhenghuishengq的博客 1万+

JVM入门到精通系列 (二)运行时数据区的程序计数器和虚拟机栈简介----栈与计数器的深度理解

文章目录运行时数据区概述:程序计数器(PC寄存器)--program counter register:一:pc寄存器作用:二:两个常见问题:虚拟机栈--stack:一:是什么?二:生命周期:三:作用:四:栈的异常:如何设置栈内存大小:五:栈的存储单位:java栈帧方法有两种返回函数的方式:六:栈帧的内部结构:局部变量表(local variables)Slot理解:静态变量和局部变量的对比和小结: 运行时数据区概述: 每个线程: 独立包括程序技术器,栈,本地栈 线程间共享: 堆,堆外内存(永久代或元空间,

qq_35050438的博客 972

4. JVM运行时数据区与JVM指令集

TestIPulsPlus Runtime Data Area PC 程序计数器,存放指令位置,虚拟机的运行,类似于这样的循环, while(not end){ 取PC中的位置,找到对应位置的指令; 执行该指令; PC++; } Heap 所谓栈指的是下面两块 JVM stacks:每个线程对应一个栈,装着一个个栈帧,每个方法对应一个栈针frame。java虚拟机管理的栈 n...

hanzong110的博客 176

JVM运行时数据区和指令集

Runtime Data Area and Instruction Set jvms 2.4 2.5 指令集分类 基于寄存器的指令集 基于栈的指令集 Hotspot中的Local Variable Table = JVM中的寄存器 Runtime Data Area PC 程序计数器 存放指令位置 虚拟机的运行,类似于这样的循环: while( not end ) { ​ 取PC中的位置,找到对应位置的指令; ​ 执行该指令; ​ PC ++; } JVM Stack Frame - 每个方法对应

星星都没我亮的博客 387
上一篇: 双非本科毕业的我,为何能在金九银十期间斩获京东、字节、快手的offer
下一篇: 身为程序员,你连网络协议都不懂,你拿什么年薪百万?
Java奥利给
博客等级 码龄6年 150粉丝 154原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值