Java内存区域——JVM读书笔记<一>

JAVA私房菜专栏之Java虚拟机(jvm) Java面试通关手册(Java学习指南)github地址(欢迎star和pull):https://github.com/Snailclimb/Java_Guide 下面是按jvm虚拟机知识点分章节总结的一些jvm学习与面试相关的一些东西。一般作为Java程序员在面试的时候一般会问的大多就是Java内存区域、虚拟机垃圾算法、虚拟垃圾收集器、JVM内存管理这些问题了。这些内容参考周的《深入理解Java虚拟机》中第二章和第三章就足够了对应下面的深入理解虚拟机之Java内存区域:和深入理解虚拟机之垃圾回收这两篇文 阅读详情

Java虚拟机运行时数据区

运行时数据区主要包括:方法区、堆、虚拟机栈、本地方法栈、程序计数器。

其中方法区和栈是线程共享的区域,另外三块区域是每个线程私有的区域。各个数据区的功能简单说明如下:

程序计数器:当前线程所执行的字节码的行号指示器。

虚拟机栈:描述Java方法执行的内存模型——每个方法在执行的同时都会创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法从调用直至执行完成的过程,就对应一个栈帧在虚拟机栈中入栈到出栈的过程。如果栈的深度大于虚拟机所允许的深度,将抛出StackOverflowError异常。如果栈扩展时无法申请到足够的内存,将抛出OutOfMemoryError异常(下述的本地方法栈类同)。

本地方法栈:与虚拟机栈的作用类似。虚拟机栈为Java方法服务,本地方法栈为Native方法服务。

Java堆:在虚拟机启动的时候创建,作用是存放对象实例。通过-Xmx和-Xms控制堆的大小。如果在堆中没有内存完成实例分配,并且堆也无法再扩展时,将抛出OutOfMemoryError异常。

方法区:作用是存储已被虚拟机加载的类信息、常量、静态变量等(在HotSpot中称此区域为Permanent Generation)。




对象的创建

对象的创建包括四个步骤:类加载检查、为新生对象分配内存、初始化为零值、设置对象头。

一、类加载检查

虚拟机遇到一条new指令时,收件将检查该指令的参数是否能在常量池(运行时常量池是方法区的一部分。Class文件除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池,用于存放编译期生成的各种字面量和符号引用,这部分内容将在类加载后进入方法区的运行时常量池中存放。)中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,那必须先执行相应的类加载过程。

二、为新生对象分配内存

对象所需内存大小在类加载完成后便完全确定,则分配内存等同于把一块确定大小的内存从Java堆中划分开来。分两种情况:Java堆中内存是绝对规整的(称为指针碰撞,Bump the pointer)、内存不规整(称为空闲列表,Free List)。在规整的Java堆中,用过的内存放一边,空闲的内存放一边,中间放一个指针作为分界点。在不规整的Java堆中,虚拟机维护一个列表记录哪些块是可用的。选择那种分配方式由Java堆是否规整决定,而Java堆是否规整由采用的垃圾收集器是否带有压缩整理功能决定。如:在使用Serial、ParNew等带Compact过程的收集器时,采用的分配算法是指针碰撞;而使用CMS基于Mark-Sweep算法的收集器时,采用空闲列表。

三、分配内存过程需要保证线程安全

对分配内存空间的动作进行同步处理;或者是把内存分配的动作按照线程划分在不同的空间进行(即本地线程分配缓冲Thread Local Allocation Buffer)。

四、对象头的设置

说明是哪个类的实例、如何找到类的元数据信息、对象的哈希码、对象的GC年龄。


对象的访问定位

Java程序通过栈上得reference数据操作堆上得具体对象。有两种访问方式:使用句柄和直接指针。

一、使用句柄

reference中存储的是稳定的句柄地址,在对象实例数据被移动时(垃圾回收时)只会改变句柄中的实例数据指针,而reference本身不需要改变。

二、使用直接指针

速度快,因为它节省了一次指针定位的时间开销。


说明:本文的内容参考书籍《深入理解Java虚拟机(第2版)》


香橙派5Max + Realsense D435i + Fast-Drone-250:手把手教你搭建一个完整的无人机视觉开发环境 本文详细介绍了如何利用香橙派5Max、Realsense D435i深度相机和Fast-Drone-250项目搭建完整的无人机视觉开发环境。从硬件连接到ROS配置,再到项目部署与性能优化,提供全栈式实战指南,助力开发者快速实现SLAM算法验证和自主导航功能开发。 阅读详情

相关推荐

Python主要智能优化算法库汇总

最近几年简单浏览和对比了一些智能算法的库。现将各种库的主要信息、相关优缺点简单整理如下,各位同学可根据自己的需求和喜好进行选择。 文章目录1、DEAP2、mealpy3、scikit-opt (国产良心)4、Geat2(国产用心)5、pygmo26、pyswarms7、SciPy(想不到吧)小结 1、DEAP 项目地址:https://github.com/DEAP/deap 安装: pip install deap 优点: 起点高,发表在Journal of Machine Learning Rese

半个冯博士 2万+

jvm 读书笔记(一) —— java 内存区域

java 内存区域划分 程序计数器 程序计数器是一块较小的内存空间,它的作用是记录下一条指令的地址。 可以看做是当前线程所执行的字节码的行号指示器。 ...

qq_45473439的博客 1010

省三医院新门诊大楼网络安全建设项目实施方案

为了响应国家建设数字医疗,构建医联网、医共体的号召,新门诊大楼现有计算机网络,实现各门诊室、药房、医学影像科室及后勤科室的终端数据互通。在互联网出口以三层模式部署两台防火墙,作为连接公网的出口设备;出于等保合规和自身业务安全的考虑,现需要该网络上通过网络安全设备实现安全建设。公网出口防火墙,配置攻击防御策略,防御互联网上的病毒进入内网。公网出口防火墙配置攻击防御策略,防御外网对内网的入侵行为。服务器取得边界防火墙,配置攻击防御策略,入侵防御策略。公网出口防火墙配置入侵防御策略,防御外网对内网发起的D。

m0_63645854的博客 2014

读书笔记 | Java 内存区域

一、概述 本篇博客是基于《深入理解Java虚拟机》一书的读书笔记,是对笔者所学知识点的一个记录,本篇博客所包含的知识点如下: JVM 内存区域的划分 划分区域各自的功能和职责 对象的创建、内存布局和访问定位 JDK1.8 中的虚拟机 二、内存区域的划分 JVM 在执行 Java 程序的过程中会把它所管理的内存划分为若干个不同的数据区域,如下图所示: 其中方法区(Method Area)和堆(...

Marck的博客 1307

别再手动写ZPL了!用C#和斑马官方SDK搞定ZT410 RFID打印机(附中文乱码解决方案)

本文详细介绍了如何使用C#和斑马官方SDK驱动ZT410 RFID打印机,解决中文乱码和RFID数据写入等常见问题。通过实战指南,开发者可以快速掌握从基础连接到高级调试的全流程,提升打印效率和可靠性。特别适用于物流、零售和资产管理领域的应用。

weixin_29267307的博客 224

微信好友恢复全攻略(2025年3月更新)

适用于仅被拉黑场景(成功率100%)针对7天内误删场景(成功率78%)

2301_77933942的博客 1万+

Java虚拟机(JVM)读书笔记

Java虚拟机(JVM)第二版2、Java 内存区域与内存溢出异常2.1、运行时数据区域1、程序计数器2、Java 虚拟机栈3、本地方法栈4、 Java 堆5、方法区运行时常量池直接内存2.2、HotSpot 虚拟机对象探秘1、 对象的创建,类加载比较重要2、 对象的内存布局3、 对象的访问定位2.3、 OutOfMemoryError(OOM)异常1、 Java堆溢出2、 虚拟机栈和本地方法栈溢出3、 方法区和运行时常量池溢出,了解3、垃圾回收器与内存分配策略3.1、对象已死吗1、 引用计数法,可以看博客

weixin_43271235的博客 855

LEC/FORMAL --- PARTIII debug

lec(logic equivalence checking)又叫formal check,是对ic design的综合,PR前后的设计进行逻辑对比检查的工具/手段,保证综合不改变rtl原始的logic function。目前用的较多的就是C家的formal工具。接下来介绍一下lec过程中遇到的问题以及debug手段。...

sinat_27691203的博客 7709

细说JVM(Java内存区域划分AND初探对象的创建)

一、前言 经过一番思想斗争,我决定好好的学习一下JVM,而对于一个JVM的初学者《深入理解Java虚拟机》当然是必须拜读的神作,所以这个专栏暂时会记录我阅读时的笔记吧,以后有可能真正深入学习Java虚拟机后,可能会有一些自己研究的成果,不过这估计是很久以后的事情了,看过这本书的也可以接机复习一下相关的知识,没有看过书的,我尽量把我所学到的知识写的通俗易懂一些,不过还是及其推荐阅读一下《深入理解J...

啦啦啦的博客 760

Newton & Nvidia 开源 GPU 加速机器人仿真器入门教程(一)

Newton 是一个 GPU 加速、可扩展和可微分的物理仿真引擎,专为机器人、研究和高级仿真工作流而设计。Newton 基于 NVIDIA Warp 并集成了 MuJoCo Warp,为用户和开发人员提供了高性能仿真、现代 Python API 和灵活的架构。

机器人控制与仿真应用 1482

SAP 打印输出中 `#` 字符替代日文汉字的根本原因与全面解决方案

只要认清设备类型 / 字符集 / 字体三角关系,并合理利用PDFUCSWINCF或 UPE + URDT,LP01里那些恼人的就会彻底消失,日文汉字将在纸面与 PDF 中如预览一样完美呈现。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 816

【读书笔记】JVM原理 - 运行时内存区域

JVM原理 - 运行时内存区域 程序计数器 程序计数器是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器。 在虚拟机的概念模型中(不同的虚拟机实现可能会不同),字节码解释器工作时就是通改变程序计数器的值来选取下一条要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖程序计数器来完成。 由于Java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式...

YanLeaon的博客 279

【RT-DETR涨点改进】独家小目标涨点改进篇 | TGRS 2025 | RT-DETR引入ABRNet小目标检测顶刊中的:ARF自适应性感受野和MCA双向交叉轴注意力,适合小目标检测有效涨点

本文提出了一种改进的RT-DETR小目标检测方法,通过集成自适应感受野模块(ARF)和多尺度交叉轴注意力模块(BC)来提升检测性能。ARF模块采用多种卷积核动态调整感受野,有效捕获多尺度目标特征并减少背景干扰;BC模块通过多尺度交叉轴注意力机制增强全局信息提取和特征融合能力。实验表明,该方法在复杂背景下显著提升了红外小目标检测的精度和效率,同时降低了计算开销。文章详细介绍了模块结构、原理及实现代码,并提供了多种改进配置方案,为小目标检测任务提供了有效的解决方案。

Ai缝合怪、助力小伙伴高效发论文 570

深入理解JVM虚拟机读书笔记(一)

的,他的生命周期与线程相同,每个方法被执行的时候,Java虚拟机都会创建一个栈帧,用于存放局部变量表、操作数栈、动态链接、方法出口等信息,每一个方法被调用直至完毕的过程,就对应一个栈帧在虚拟机栈中从入到出的过程。ps:HotSpot虚拟机栈不会扩容,所以对于他来说,他的OOM的问题仅仅只是线程申请栈空间失败了的报错,而StackOverflowError是说一个线程申请的栈的深度大于允许深度。再进一步思考不难发现的是,这里似乎都存放着的都是Java中的方法相关的信息,因此Java虚拟机栈又被称为方法栈。

hsjpcjy的博客 766

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

读书笔记之JVM内存区域

Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为以下若干个不同的数据区域,本文就是简单说明下这些区域的作用,服务对象以及其中可能产生的问题 1、程序计数器:当前线程所执行的字节码的行号指示器,字节码解释器通过改变这个计数器的值来选取下一条需要执行的字节码指令。Java虚拟机是通过线程轮流切换并分配处理器的执行时间来实现多线程的,对于某个确定的时刻来说,一个处理器都只会执行一...

岁末的枫雨 365

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

JVM读书笔记之JVM内存管理

一. Java组件的内存使用       Java启动后作为一个进程运行在操作系统中,其组件部分需要分配内存。 Java堆           Java堆是 用于存储java对象的内存区域,堆的大小在JVM启动时就一次性向操作系统申请完成,通过-Xmx(最大大小)与-Xms(初始大小)控制大小,一旦分配完成,堆的大小固定,不能在内存不够时向操作系统申请。JVM管理java堆的内存空间,对

ghostWARDEN的博客 904

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

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

《深入理解java虚拟机》读书笔记——jvm内存区域

java虚拟机所管理的内存将会包括下列几个运行时数据区域: 方法区: 1、用于存储已被虚拟机加载的类信息、常量、静态变量和即时编译器编译后的代码等数据。 2、垃圾收集在这个区域较少出现,主要是针对常量池的回收和类型的卸载,当方法区无法满足内存分配需求时,将抛出OutOfMemoryError异常(OOM)。 3、该区域被线程共享。 4、运行时常量池是方法区的一部分,用于存放编

qq_31957747的博客 694

JVM学习01——内存区域及内存溢出

运行时数据区域  Java虚拟机在执行Java程序的过程中会把它所管理的内存区域划分为若干个不同的数据区域。这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则依赖用户线程的启动和结束而建立和销毁。根据《Java虚拟机规范(Java SE 7版)的规定,Java虚拟机所管理的内存将会包括以下几个运行时数据区域。 1.程序计数器(Program Coun

小小本科生成长之路 9056

《深入理解JVM》读书笔记

抽时间重新读了一遍《深入理解JVM》一书。以下为摘录内容。 1 java内存区域 java虚拟机运行时数据区 1.1 程序计数器 是一块较小的内存空间,可以看做是当前线程所执行的字节码的行号指示器。每条线程都有一个独立的程序计数器,各条线程之间计数器互不影响。 1.2 java虚拟机栈 描述的是java方法执行的内存模型:每个方法在执行...

weixin_34009794的博客 184

《深入理解java虚拟机》读书笔记(1)- JVM内存基本结构

文章目录前言一、JVM运行时内存区域二、java对象在内存中是怎样存在的1. 对象的创建1.1 对象创建方式1.2 考虑多线程的情况2. 对象的内存布局3. 怎么找到内存中的对象总结 前言 面向的读者: 有一定java基础 想系统学习JVM基础知识 一、JVM运行时内存区域 需要注意的是,JVM划分了很多内存区域,这些区域都是逻辑上的。其实在物理上,他们可以是同一块区域或者不块区域。这里,我们只讨论逻辑区域。 程序计数器(program counter register): 由JVM 控制,没有定义O

masternick的专栏 208

《深入理解Java虚拟机》读书笔记(一)--java内存区域划分

Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。 这些区域有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而一直存在,有些区域则是依赖用户线程的启动和结束而建立和销毁。 根据《Java虚拟机规范》的规定,Java虚拟机所管理的内存将会包括以下几个运行时数据区域。 程序计数器:(Program Counter Register)是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器。在Java虚拟机的概念模型里 ,字节码解释器工作时就是通

a816120的博客 269

《深入理解Java虚拟机》读书笔记1--Java内存区域

《深入理解Java虚拟机》是我个人读过的第一本关于JVM方面的书籍。十分有幸能够读到这本书,在此对作者表示深刻的敬意不知道有没有人和我一样有类似的情况,就是一本书读完,经过一段时间之后,林林总总最后留在脑子里的并不多,很多东西又还给了作者。有人可能会说,之所以会遗忘,是因为你根本没有理解。我并不否认这点,说实话,很多书读过一遍之后都会存在没有读懂的部分。但是随着我们阅历的丰富以及期间不断的学习,过

虾米的博客 448

读书笔记之初见JVM内存区域

详细介绍了JVM内存分区以及各个内存的服务对象,最后简单的介绍了java中对象的创建和访问过程

涂印的博客 486

JVM读书笔记一Java内存区域

运行时数据区域 前言: 本文主要是基于书上内容的总结提取,并不包含作者的思考和理解,作者的思考和理解有单独博客。 一、程序计数器 线程私有,可以看作是当前线程所执行的字节码的信号指示器,记录的是正在执行的虚拟机的字节码的地址。如果正在执行的是本地方法,则计数器应该为空,此内存区域是唯一一个在Java虚拟机规范中唯一没有规定任何OutOfMemoryError情况的区域。 二、Java虚拟机栈 线程私有,生命周期和线程相同,是Java方法执行的内存模型,每个方法被执行的时候,Java虚拟机会同步创建一个栈帧,

weixin_44284706的博客 293

JVM-2、虚拟机内存区域与内存溢出异常

JVM-2、虚拟机内存区域与内存溢出异常 声明:本系列文章是本人通过阅读作者周志明的《深入理解Java虚拟机》以及网上查阅部分资料后,整理的读书笔记。后期会不定时更新以及修正。 1、概述 C、C++程序员需要管理和维护对象的内存。JVM底层是由C语言来实现的。又因为有JVM自动内存管理机制,所以Java程序员不需要去管理相应内存。但是了解虚拟机是怎样使用内存的,排查错误、修正问题将会变得简单。 2、运行时数据区域 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域

weixin_44834328的博客 354
上一篇: 数据结构 二叉堆 & 堆排序
下一篇: 垃圾回收算法简介——JVM读书笔记<二>
Hooting
博客等级 码龄17年 11粉丝 44原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值