JVM内存区域

news2024/11/25 13:20:40

预备

为了更好的理解类加载和垃圾回收,先要了解一下JVM的内存区域(如果没有特殊说明,都是针对的是 HotSpot 虚拟机。)。

Java 源代码文件经过编译器编译后生成字节码文件,然后交给 JVM 的类加载器,加载完毕后,交给执行引擎执行。在整个执行的过程中,JVM 会用一块空间来存储程序执行期间需要用到的数据,这块空间一般被称为运行时数据区,也就是常说的 JVM 内存。

JVM的不断在发展,所以内存区域的规范也在更新

Java 运行时数据区域(JDK1.7)

Java 运行时数据区域(JDK1.8 )

看这个地方的时候,总是不自觉的联想到操作系统的虚拟内存空间,疑惑它们之间的区别,这个博文JVM内存是对应到操作系统内存_jvm内存和电脑内存的关系_ManimalW的博客-CSDN博客解释了我的疑惑。

 线程私有部分

程序计数器:每个线程私有,是一块内存区域,存放下一个要执行的字节码指令的地址。程序计数器中存储的数据所占的空间不会随程序的执行而发生大小上的改变,因此,程序计数器是不会发生内存溢出现象(OutOfMemory)的问题

虚拟机栈:每个线程私有,存放栈帧,方法调用时入栈,结束时出栈

本地方法栈:和虚拟机栈所发挥的作用非常相似,区别是:虚拟机栈为虚拟机执行 Java 方法 (也就是字节码)服务,而本地方法栈则为虚拟机使用到的 Native 方法服务。 在 HotSpot 虚拟机中和 Java 虚拟机栈合二为一。

以上三者是线程私有,也就是每个线程都有这样一块区域只存放自己的东西。

线程共享部分

:heap,是垃圾回收的主要区域,从垃圾回收的角度来看,由于垃圾收集器基本都采用了分代垃圾收集的算法,所以会将堆细分。

在 JDK 7 版本及 JDK 7 版本之前,堆内存被通常分为下面三部分:

  1. 新生代内存(Young Generation)
  2. 老生代(Old Generation)
  3. 永久代(Permanent Generation)

其中永久代是方法区的具体实现,《Java 虚拟机规范》规定了有方法区这么个概念和它的作用,具体实现靠各种虚拟机。hotspot的实现就是永久代,HotSpot 使用 GC分代来实现方法区内存回收。从jdk8开始变成了元空间,放在了本地内存中存放。

总结一下区别:

 永久代和元空间是hotspot针对方法区不同的实现

永久代在堆空间中,元空间在本地内存

永久代变成元空间后,静态变量和字符串常量也被移动到了堆中存放

运行时常量池:在方法区中,在hotspot中就是元空间或者永久代中。运行时常量池用来动态获取类信息,包括:class文件元信息描述、编译后的代码数据、引用类型数据、类文件常量池等。

字符串常量池:这个存放字符串常量,创建字符串之前检查常量池中是否存在,如果存在则获取其引用,如果不存在则创建并存入,返回新对象引用。

对象创建的过程

1.类加载检查 检查类有没有被加载初始化过,如果没有 执行类加载过程

2.分配内存 为对象分配内存

3.初始化零值

4.设置对象头 例如这个对象是哪个类的实例、如何才能找到类的元数据信息、对象的哈希码、对象的 GC 分代年龄等信息。 这些信息存放在对象头中。 另外,根据虚拟机当前运行状态的不同,如是否启用偏向锁等,对象头会有不同的设置方式。

5.执行<init>方法

对象访问定位

直接指针

栈中的引用存放的就是对象的地址

基于句柄

堆中划分一块区域作为句柄池,池中存放的就是地址,栈中的引用存放的时句柄的地址

面试题

  • 介绍下 Java 内存区域(运行时数据区)
  • Java 对象的创建过程(五步,建议能默写出来并且要知道每一步虚拟机做了什么)
  • 对象的访问定位的两种方式(句柄和直接指针两种方式)

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

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

相关文章

揭秘内存暴涨:解决大模型分布式训练OOM纪实

在现代深度学习开发中&#xff0c;我们通常依赖其他模块&#xff0c;像搭积木一样构建复杂的软件系统&#xff0c;这个过程往往快速且有效。然而&#xff0c;如何在遇到问题时迅速定位和解决问题&#xff0c;由于系统的复杂性和耦合性&#xff0c;一直困扰着深度学习系统设计和…

UTONMOS:元宇宙在网络游戏领域得到充分运用

元宇宙到底是个啥&#xff1f;这个词大概意思应该就是人类能从真实世界进入一个虚拟世界体验另一种生活&#xff0c;这个虚拟的世界就叫“元宇宙”。 从科幻走入现实&#xff0c;元宇宙究竟有什么用途&#xff1f;它离我们到底还有多远&#xff1f;又将给我们的生活带来哪些变…

htmlCSS-----高级选择器

目录 前言 伪类选择器 状态类 结构类 伪元素选择器 属性选择器 前言 前面我们学习了CSS中的相关选择器&#xff08;链接html&CSS-----CSS选择器&#xff08;上&#xff09;_灰勒塔德的博客-CSDN博客 html&CSS-----CSS选择器&#xff08;下&#xff09;_灰勒塔…

【Linux】线程的互斥

目录 写在前面的话 相关背景概念 什么是互斥 互斥锁&#xff08;互斥量&#xff09; 互斥锁的使用 一些相关的问题 线程安全和可重入的区别 写在前面的话 本文章主要介绍了线程的互斥的相关内容&#xff0c;而且本文的概念也比较多&#xff0c;所以需要有一些前提知识作…

【ES6】深入理解ES6(1)

一、块级作用域绑定 var声明及变量提升机制 二、字符串和正则表达式 字符串&#xff08;String&#xff09;是JavaScript6大原始数据类型。其他几个分别是Boolean、Null、Undefined、Number、Symbol&#xff08;es6新增&#xff09;。 更好的Unicode支持 1. UTF-16码位 字…

23款奔驰AMG GT50更换原厂运动排气系统,战斗感立马提升了

改装运动排气&#xff0c;原车中控的按键组也是需要更换的。与原车按键相比&#xff0c;只是多了一个排气的控制按键&#xff0c;也正是这个按键&#xff0c;能让车辆可静可怒&#xff0c;安静与怒吼就在一键之间。

QT-图标绘画工具

QT-图标绘画工具 一、效果演示二、关键程序三、程序链接 一、效果演示 二、关键程序 代码如下&#xff1a; #include "DrawDialogFactory.hpp" #include "DrawDialog.hpp" #include "GlobalDrawProperties.hpp"#include "Shape.hpp"…

pnpm常用命令

pnpm常用命令 下载pnpm&#xff0c;但是出现了 npm WARN notsup Unsupported engine for pnpm8.6.12: wanted: {"node":">16.14"} (current: {"node":"14.15.0","npm":"6.14.8"}) npm WARN notsup Not compa…

ViewUI表格Table嵌套From表单-动态校验数据合法性的解决方法

项目场景&#xff1a; 项目需求&#xff1a;在表格中实现动态加减数据&#xff0c;并且每行表格内的输入框&#xff0c;都要动态校验数据&#xff0c;校验不通过&#xff0c;不让提交数据&#xff0c;并且由于表格内部空间较小&#xff0c;我仅保留红边框提示&#xff0c;文字…

【编程指南】ES2016到ES2023新特性解析一网打尽

ES2016 Array.prototype.includes() Array.prototype.includes 方法&#xff1a; 这个方法用于检查数组是否包含特定元素&#xff0c;如果包含则返回 true&#xff0c;否则返回 false // 我有一个水果篮子 const fruitBasket [apple, banana, orange, grape];// 我要检查篮…

关于pycharm安装出现的interpreter field is empty,无法创建项目存储位置

关于pycharm安装出现的interpreter field is empty&#xff08;解释器为空&#xff09; 关于pycharm安装出现的interpreter field is empty&#xff0c;无法创建项目存储的位置。如图&#xff1a; 我之前安装的时候一直老是有这个提示&#xff0c;后来才发现是因为没安装这个p…

腾讯云服务器轻量和CVM有什么区别?

腾讯云轻量服务器和云服务器有什么区别&#xff1f;为什么轻量应用服务器价格便宜&#xff1f;是因为轻量服务器CPU内存性能比云服务器CVM性能差吗&#xff1f;轻量应用服务器适合中小企业或个人开发者搭建企业官网、博客论坛、微信小程序或开发测试环境&#xff0c;云服务器CV…

linux 安装go 1.18版本

首先去官网找到对应的版本 直接下载下来&#xff08;如果服务器可以直接访问到go 官网也可以wget直接下载到服务器&#xff09; 然后把该包上传到linux 的/usr/local 目录下 然后直接解压安装该包&#xff1a; sudo tar -C /usr/local -zxvf go1.18.10.linux-amd64.tar.gz 然…

通过Statement静态语句,实现CRUD操作

首先你需要创建 数据库 和 s_students学生表&#xff0c;再进行下一步的 增&#xff08;add&#xff09;&#xff0c;删(del)&#xff0c;改(update)&#xff0c;查(query)。 查询所有学生姓名&#xff1a; Testvoid query(){try{Statement st conn.createStatement();ResultS…

利用Torchmetrics库快速进行Torch的评价指标计算(推荐)

目录 1、安装 2、基本流程介绍 3、MetricCollection 4、自定义指标 5、我们可以调用多个指标计算不同的任务 6、可以是标签,也可以是one_hot编码 7、常用分类指标计算 8、异常报错 1、安装 官网地址:Welcome to TorchMetrics — PyTorch-Metrics 1.0.1 documenta…

JUL 日志 - 最简单易用的Java日志框架

在正式的生产环境下是不能使用 System.out 进行日志记录的 因为 System.out 不能提供时间、线程、执行过程 等信息&#xff0c;如果要手动打印输出则会非常麻烦 而日志就帮我们把这些事给干了 接下来我们学一个最简单的日志框架 JUL JUL全称Java util Logging是java原生的日志框…

用户数据报协议UDP

UDP的格式 载荷存放的是:应用层完整的UDP数据报 报头结构: 源端口号:发出的信息的来源端口目的端口号:信息要到达的目的端口UDP长度:2个字节(16位),即UDP总长度为:2^16bit 2^10bit * 2^6bit 1KB * 64 64KB.所以一个UDP的最大长度为64KBUDP校验和:网络的传输并非稳定传输,…

资源限制类题目解法,看这一篇就够了!

算法拾遗三十七资源限制类题目 资源限制技巧汇总32位无符号整数的范围是0~4,294,967,295&#xff0c;现在有一个正好包含40亿个无符号整数的文件&#xff0c;可以使用最多1GB的内存&#xff0c;怎么找到出现次数最多的数32位无符号整数的范围是0~4294967295&#xff0c;现在又一…

【VBA入门】WorkBook 对象 Name操作 宏录制筛选删除代码

VBA 入门 问题记录1 了解Excel工作簿、表格关系1 默认新建WorkBook2 新建WorkBook并命名工作表添加数据3新建带有指定数量工作表的工作簿 ActiveWorkbook.Names用法(1) 创建名称 (全局名称和局部名称&#xff09; 宏录制验证删除可行性大招&#xff01;&#xff01;&#xff01…

Linux基础与应用开发系列九:各类系统函数与标准IO函数

open_close函数 OPEN函数 头文件&#xff1a; #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> 函数原型&#xff1a; 当文件存在时 int open(const char* pathname,int flags) 当文件不存在时 int open (const char* pathname,int f…