JVM篇:JVM内存结构

程序计数器

程序计数器英文名叫:Program Counter Register

作用:用来记录下一条jvm指令的地址行号。

先来查看一段jvm指令,这些指令对应的java代码就是输出1-5

操作系统运行该Java程序时具体流程如下

语言解释:源文件通过编译转化为二进制字节码文件后,解释器会获取第一行jvm指令后解释为机器码供CPU执行,与此同时程序计数器记录下一条jvm指令的行号,随后解释器从程序计数器中获取应该解释哪条jvm指令供CPU执行,由于程序计数器需要频繁的更新jvm行号,为了保证响应速度,jvm在设计时采用寄存器实现程序计数器。

特点:

  • 线程私有(即当CPU在执行线程1过程中去执行线程2,程序计数器会保留线程1的下一条指令的地址行号,等到线程1恢复执行时接着下一条指令接着执行。每个线程都有自己的程序计数器)
  • 是JVM唯一一个不会存在内存溢出问题区域。

虚拟机栈

每个线程所需要的内存空间我们使用虚拟机栈来表示(早期也叫Java栈),每个栈由栈帧组成,栈帧对应的是方法调用时所需的内存,每个线程只存在一个活动栈帧,即正在执行的方法

接下来,我们结合代码理解虚拟机栈

在上述代码中,当我们执行到method2方法时,栈帧一共存在3个分别是main方法的栈帧,method1的栈帧与method2的栈帧,并且method2的栈帧在栈的顶部

栈问题

垃圾回收是否涉及栈内存

垃圾回收器针对的是堆内存中无用的对象,而栈内存对应的是调用方法所需要的内存,而方法执行结束后会自动释放内存,因此垃圾回收并不需要管理栈内存。

栈内存分配越大越好吗

并不是。电脑的内存大小是固定的,栈内存分配越多可能会导致线程数量减少。比如一个内存为500M的电脑,栈内存分配为1M,则理论说该电脑可以存在500个线程,如果栈内存分配为2M,则理论线程就为250个。

方法的局部变量是否线程安全

对于变量是否是线程安全,主要是看该变量是共享的还是私有的。

本地方法栈

与栈内存相似,不过提供的不是线程所需内存而是给本地方法提供内存(本地方法指的是通过java调用其他语言编写的方法)

通过new创建出来的对象都存储在堆内存中

特点:堆内存中的变量是线程共享的。具有垃圾回收机制

堆问题

堆内存溢出

虽然堆存在垃圾回收机制,但是垃圾回收机制只能回收不再使用的对象,如果对象正在被使用是不会被回收的,由于堆内存默认大小为4G,当我们的程序在短时间内的执行可能不会暴露堆内存溢出的情况,这时我们可以设置堆内存小一些进行测试(命令为-Xmx[指定大小])。

堆内存诊断

  • jps 工具
    查看当前系统中有哪些 java 进程
  • jmap 工具
    查看堆内存占用情况 jmap - heap 进程id
  • jconsole 工具
    图形界面的,多功能的监测工具,可以连续监测

方法区

线程共享区域,用来存储类的结构

方法区可能会存在内存溢出的情况,在实际场景中,spring与mybatis经常会动态的加载一些类,因此当程序运行期间创建了足够多的类可能会导致方法区内存溢出(JDK1.8之前叫做永久代内存溢出,JDK1.8之后叫做源空间内存溢出)

常量池

首先查看一个示例代码,是一个最基本的入门案例

public class Demo1 {
    public static void main(String[] args) {
        System.out.println("hello world");
    }
}

下面我们通过对该类的编译后的class文件进行反编译得到二进制字节码文件

javap -v Demo1.class

在二进制字节码文件中,存储了类的基本信息,常量池,类方法定义,包含了虚拟机指令

类的基本信息如下

常量池信息如下(只粘贴了一部分)

类方法定义信息如下

而虚拟机指令存储在类的方法定义中

在上面截图中,需要具体获取哪些静态变量加载哪些参数都需要从常量池中获取,而在常量池中的哪些位置需要从后面的#号中获取,就以该例子为例。首先是需要获取#2中的数据,那么我们去常量池中找该行的信息

运行时常量池

常量池是*.class文件中的,当该类被加载时,它的常量池信息就会被放入运行时常量池,并把里面的符号地址变为真实地址(简而言之就是在运行时会将常量池中的#1,#2转化为内存中的真实地址,而不是#1#2)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于机器视觉的害虫种类及计数检测研究-人工智能项目-附代码

概述 农业与民生和经济发展息息相关,对农业发展科学化的关注既是民生需求, 也是经济稳步发展的迫切需求。病虫害是影响农作物生长的重要因素,对农作物的产量和品质都能造成无法估计的损害。 - 针对目前广大农业产区农业植保人员稀缺、病虫害…

从零开始配置kali2023环境:配置jupyter的多内核环境

在kali2023上面尝试用anaconda3,anaconda2安装实现配置jupyter的多内核环境时出现各种问题,现在可以通过镜像方式解决 1. 搜索镜像 ┌──(holyeyes㉿kali2023)-[~] └─$ sudo docker search anaconda ┌──(holyeyes㉿kali2023)-[~] └─$ sudo …

关于this.router 和this.route的总结

this.router 和this.route这2个东西一直在用可是我还是迷迷糊糊的不知道啥啥意思,尤其是idea的提示功能,总是让我一个回车就弄错了。 总结一波: 概述 this.$router(路由实例) : 是VueRouter的实例.包含了很多属性和对象(比如 h…

V8R6小版本升级步骤(单机环境)

在KingbaseES V8R6版本提供了sys_upgrade的升级工具。 sys_upgade介绍 sys_upgrade实现KingbaseES服务器实例版本升级。 sys_upgrade 允许将存储在KingbaseES数据文件中的数据升级到一个更高的KingbaseES主版本,而无需进行主版本升级(例如从 V8R6C4 到 V8R6C5)通常…

Django开发5-Django开发知识点快速预览

Django开发知识点快速预览 Django开发1.知识点的回顾:2.Ajax请求3.订单小结图表 各位小伙伴想要博客相关资料的话关注公众号:chuanyeTry即可领取相关资料! Django开发 1.知识点的回顾: 安装Django pip install django创建Django项…

通达信佳庆离散指标公式,衡量价格波动率

佳庆离散指标(Chaikin Volatility)是由股票经纪人Mark Chaikin发明的,通过计算选定时期内最高价和最低价之间的差值来衡量价格波动率,将波动率量化为最高价和最低价之间范围的扩大或缩小。 在技术分析中,波动性具有比…

5 个顶级的免费磁盘分区软件工具评测分享

磁盘分区可能是一个脆弱而复杂的过程,磁盘崩溃或用户设备受到病毒攻击的风险很高。因此,它们很难由用户单独或手动管理。本文详细介绍了可以帮助简化磁盘分区过程的不同软件工具、它们的功能和优点。那么让我们开始吧。 什么是磁盘分区工具?…

常见的锁策略详细讲解(悲观锁 vs 乐观锁,轻量锁 vs 重量锁,自旋锁 vs 互斥锁,公平锁 vs 非公平锁,读写锁等)

文章目录 悲观锁和乐观锁Java中的悲观锁和乐观锁乐观锁常见的两种实现方式版本号机制CAS(compare and swap) 算法乐观锁的缺点 轻量级锁和重量级锁自旋锁 VS 互斥锁公平锁 VS 非公平锁读写锁读写锁的插队策略读写锁的升级策略 可重入锁 VS 不可重入锁 悲观锁和乐观锁 所谓悲观…

Android 13 - Media框架(29)- MediaCodec(四)

上一节我们了解了如何通过 onInputBufferAvailable 和 getInputBuffer 获取到 input buffer index,接下来我们一起学习上层如何拿到buffer并且向下写数据的。 1、获取 input Buffer 获取 MediaCodec 中的 buffer 有两种方式,一种是调用 getInputBuffers…

在vscode中创建任务编译module源文件

接昨天的文章 [创建并使用自己的C模块(Windows10MSVC)-CSDN博客],觉得每次编译转到命令行下paste命令过于麻烦,于是研究了一下在vscode中创建自动编译任务。 经过尝试,在task.json中增加如下代码: {"…

IDEA2023 最新版详细图文安装教程(安装+运行测试+汉化+背景图设置)

IDEA2023 最新版详细图文安装教程 名人说:工欲善其事,必先利其器。——《论语》 作者:Code_流苏(CSDN) o(‐^▽^‐)o很高兴你打开了这篇博客,跟着教程去一步步尝试安装吧。 目录 IDEA2023 最新版详细图文安…

SpringBoot整合Validator

前言 @Validation是一套帮助我们继续对传输的参数进行数据校验的注解,通过配置Validation可以很轻松的完成对数据的约束。 通过对DTO中实体类的约束,可以大大增加代码的简洁性。 错误的状态码 返回的响应码推荐使用400 bad request. 参数注解含义 实体类 /*** @author:…

索引语法SQL性能分析

创建 查看 删除 SQL执行频率 Com后七个下划线 慢查询日志 show profiles explain explain执行计划 各字段含义: 多表查询 根据主键或者唯一索引时会出现const const就已经是很棒的性能了,实际中 NULL几乎不会出现

信息安全管理与评估省赛经验总结

信息技能大赛 在比赛开始之前,一定要检查设配,认真审查注意事项;拿到题之后,把对应设备的基本配置完成,任何异常及时报告,这个时候可以把设备的线链接上配置好,登录清单上管理地址等查看是否能登…

二维码地址门牌系统技术服务:让您的生活更便捷,一码通行,安全无忧

文章目录 前言一、融合二维码技术与门牌的便捷服务二、手机开门便捷功能三、智能化安全保障四、智能化、便捷化的新型技术 前言 在数字化时代,二维码门牌系统技术应运而生,为了满足人们对安全、便捷生活的需求。这项技术将二维码与门牌结合,…

leetcode链表小练(1.反转链表2.链表的中间节点3.合并两个有序链表4.环形链表①5.环形链表②)详解 (୨୧• ᴗ •͈)◞︎ᶫᵒᵛᵉ ♡

目录 一.反转链表 思路一反转指针反向: 思路二头插法: 二.链表的中间节点: 三.合并两个有序数组: 思路一:从头开始,取两个链表中小的那个尾插到新链表。定义指针head,tail指向空,代表新链表的头结点。…

Hive/SparkSQL中UDF/UDTF/UDAF的含义、区别、有哪些函数

Hive官网:https://cwiki.apache.org/confluence/display/Hive/LanguageManualUDF#LanguageManualUDF-Built-inTable-GeneratingFunctions(UDTF) 1.UDF(User-Defined Function) 含义 即用户定义函数,UDF用于处理一行数据并返回一个标量值(单个值)&#x…

测试自动创建设备节点的功能

一. 简介 上一篇文章在 新设备驱动框架代码的基础上,添加了自动创建设备节点的代码。文章地址如下: 自动创建设备节点代码的实现-CSDN博客 本文对自动创建设备节点的功能进行测试。 二. 自动创建设备节点代码的测试 1. 编译驱动,并拷贝…

关于编程模式的总结与思考

淘宝创新业务的优化迭代是非常高频且迅速的,在这过程中要求技术也必须是快且稳的,而为了适应这种快速变化的节奏,我们在项目开发过程中采用了一些面向拓展以及敏捷开发的设计,本文旨在总结并思考其中一些通用的编程模式。 前言 静…

【Vue2+3入门到实战】(19)Vuex状态管理器通过辅助函数 - mapState获取 state中的数据代码实现 详细讲解

目录 一、通过辅助函数 - mapState获取 state中的数据1.第一步:导入mapState (mapState是vuex中的一个函数)2.第二步:采用数组形式引入state属性3.第三步:利用**展开运算符**将导出的状态映射给计算属性 二、开启严格模式及Vuex的单项数据流1…