深入理解JVM虚拟机--Java内存区域

ensp企业网综合实验(课程设计) 使用MSTP+VRRP技术实现负载均衡以及增加网络的可靠性;出口配置napt;所有用户均为自动获取IP地址; 阅读详情

一、数据区域

Java虚拟机在执行Java程序的过程中会把他管理的内存划分为若干个不同的数据区域。如下如所示:

![在这里插入图片描述](https://img-blog.csdnimg.cn/201909091

1.1 程序计数器

程序计数器是一块较小的内存空间,它可以看做是当前线程所执行的字节码的行号指示器。

唯一一个没有规定任何OutOfMemoryError情况的区域

是块较小的内存空间,可以看做是当前线程所执行的字节码的行号指示器。在虚拟机的概念模型里,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。

再多线程中,为了线程切换后能回复到正确的执行位置,线程私有

1.2 Java虚拟机栈

线程私有,线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常;如果虚拟机栈可以动态扩展,但扩展式无法申请到足够的内存,则会抛出OutOfMemoryError异常。

虚拟机栈描述的是Java方法执行的内存模型:每个方法在执行的同时会创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法从调用直到执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程

局部变量表存放了编译器可知的各种基本数据类型、对象引用和returnAddress类型(指向了一条字节码指令的地址)

局部变量表所需的内存空间在编译期间完成分配,当进入一个方法时,这个方法需要在帧中分配多大的局部变量空间是完全确定的,在方法运行期间不会改变局部变量表的大小

1.3 本地方法栈

线程私有,与虚拟机栈发挥的作用是非常相似,区别:虚拟机栈为虚拟机执行Java方法(字节码)服务,而本地方法栈则为虚拟机使用到的Native方法服务。

1.4 Java堆

线程共享,是Java虚拟机管理的内存中的最大的一块。在虚拟机启动时创建,唯一目的是存放对象实例。在Java虚拟机规范中的描述是:所有的对象实例以及数组都在堆上分配。也是垃圾收集器进行垃圾收集的最重要的内存区域。

1.5 方法区

线程共享,用于储存JVM加载的类信息、常量、静态变量、即是编译器编译后的代码等数据

1.6 运行时常量池

是方法区的一部分,用于存放编译期生成的各种字面量和符号引用,这部分内容将在类加载后进入方法区的运行时常量区中存放。

二、对象的创建

2.1 对象的创建

首先去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,那必须先执行相应的类加载过程。

在类加载检查通过后,接下来虚拟机姜维新生对象分配内存。对象所需内存的大小在类加载完成后便可完全确定,为对象分配空间的任务等同于把一块确定大小的内存从java堆中划分出来。内存是绝对规整的则使用“指针碰撞”的分配方式。不规整则使用“空闲列表"的分配方式。

2.2 对象的内存布局

在HotSpot虚拟机中,对象在内存中存储的布局可以分为3块区域:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)

对象头包括两部分:
1.用于存储对象自身的运行时数据,如哈希码、GC分代年龄、锁状态标识、线程持有的锁、偏向线程ID、偏向时间戳等。
2.存储类型指针,即对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例。

实例数据:
是对象真正存储的有效信息,也是在程序代码中所定义的各种类型的字段内容。无论是从父类继承下来的,还是在子类中定义的,都需要纪录起来。

对齐填充:
并不是必然存在的,仅仅起着占位符的作用

2.3 对象的访问定位

Java程序需要通过栈上的reference数据来操作堆上的具体对象。由于reference类型在Java虚拟机规范中只规定了一个指向对象的引用,没有定义这个引用应该通过何种方式去定位、访问堆中对象的具体位置,所以对象访问方式也是取决于虚拟机的实现而定的。目前主流的访问方式有使用句柄和直接指针两种。

句柄: Java堆中会划分出一块内存来作为句柄池,reference对象中存储的就是对象的句柄地址,而句柄中包含了对象实例数据与类型数据各自的具体地址信息。

在这里插入图片描述
指针:Java堆对象的布局中就必须考虑如何放置访问类型数据的相关信息,而reference中存储的直接就是对象地址

在这里插入图片描述
句柄的好处:reference中存储的是稳定的句柄地址,在对象被移动时只会改变句柄中的实例数据指针,而reference本身不需要修改

指针的好处:速度更快,节省了一次指针定位的时间开销,由于对象的访问在java中非常频繁,因此这类开销极少成多后也是一项非常可观的执行成本。HotSpot是使用第二种方法进行对象访问的。

基于深入理解JVM虚拟机的拙劣摘抄

第二遍阅读时再完善以上内容

瑞芯微RV1109平台GT911触摸屏驱动调试记录1 很明显这里可以看到系统已经配置了i2c-0、i2c-1、i2c-3、i2c-4、i2c-5,当开机的时候系统已经将相应的I2C节点注册成功了,说明I2C部分是没有问题的。 阅读详情

相关推荐

蓝牙6.0的‘新雷达’:Channel Sounding信道探测,真能比UWB更香吗?

本文探讨了蓝牙6.0的Channel Sounding信道探测技术在室内定位领域的应用潜力。通过与UWB技术的对比分析,揭示了其在成本、功耗和兼容性方面的优势,特别是在智能门锁、物品追踪等场景中的商业价值。Channel Sounding技术不仅具备亚米级精度,还能通过现有蓝牙设备实现零边际成本部署,为物联网应用提供了新的解决方案。

weixin_29288313的博客 333

Java内存管理:Java内存区域 JVM运行时数据区

Java内存管理:在前面的一些文章了解到javac编译的大体过程、Class文件结构、以及JVM字节码指令,下面我们详细了解Java内存区域:先说明JVM规范定义的JVM运行时分配的数据区有哪些,然后分别介绍它们的特点,并指出给出一些HotSpot虚拟机实现的不同点和调整参数。

tjiyu的博客 9921

2019年数学建模美赛经验总结

北京时间2019年1月29号上午9时,数模美赛结束。美赛结束已经10多天了,我在这次竞赛中负责建模和编程,趁现在记忆还比较清晰,写下这篇博客记录第一次参加数学建模美赛的经历。 补更:2019年4月20日公布成绩,笔者最终获得了美赛一等奖 目录 1、基本情况 2、选题 3、分工合作 4、论文写作 5、建模 6、编程 7、入门资源 ...

Smallactive 7万+

《深入理解JAVA虚拟机》详细解读(第二章 ):JAVA内存区域与内存溢出异常

目录 一、JAVA内存区域与内存溢出异常 1. 概述 2. 运行时数据区域 2.1 程序计数器 2.2 Java虚拟机栈 2.3本地方法栈 2.4 堆 2.5 方法区 2.6 运行时常量池 2.7直接内存 3.HotSpot虚拟机的对象探秘 3.1HotSpot虚拟机简介 3.2 对象的创建 3.3 对象的内存布局 3.4 对象的访问定位 4.OOM异常 4.1 ...

雨雾清影的个人博客 1611

ADI官方例程HDL和No-OS生成Vivado工程

这一步是选择下载源,一般都是选择国内镜像,因为国外的源太慢了,这里选择阿里的镜像,如果没有这个选项可以在下面的User URL里添加就行,选择好源后然后点击下一步。下一步会从你选择的源上下载软件包目录,如果提示Unable to get setup from https://xxxxxx/,返回上一步,选择别的源,例如第二个163网易的源。然后就是你想要安装在哪了,下面的选项好像会决定环境变量存放在哪,不过一般都是个人电脑选择第一个默认的就行,然后点下一步。下好之后双击打开,就是这个界面了,直接点下一步。

代码匠的博客 3832

使用DDR4控制器实现多通道数据读写

这种高带宽对于大量的数据的应用非常重要。对于Controller/PHY Mode 的选择,我们使用Controller + PHY模式,Xilinx UltraScale/UltraScale+等高端FPGA通常包含硬核PHY,选择Controller + PHY模式可直接利用硬核,降低功耗和延迟,并且此模式的开发更易上手。在Basic页面下,首先勾选上AXI4 Interface选项,我们选用的内存接口速度为2133MHz的ddr4芯片,由于双沿触发,频率为1066MHz,那么周期应为938ps。

weixin_38828382的博客 1364

《深入理解Java虚拟机》读书笔记:第二章Java内存区域与内存溢出异常

Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域:方法区、虚拟机栈、本地方法栈、堆,程序计数器 程序计数器(Program CounterRegister):一块较小的内存空间,看作当前线程所执行的字节码的行号指示器;字节码解释器工作时通过改变这个计数器的值来选取下一条需要执行的字节码指令.分支,循环,跳转,异常处理,线程恢复等基础功能都需要依赖这个计数器来完

timestatic 1657

【液晶专题】从外挂到In-Cell/ On-Cell/ OGS再也不会傻傻分不清楚了

触控技术经历了从外挂式到内嵌式的革新,主要方案包括外挂式(Out-Cell)、OGS、On-Cell和In-Cell。

一点硬件 1252

[译]深入理解JVM

深入理解JVM 原文链接:http://www.cubrid.org/blog/dev-platform/understanding-jvm-internals 每个使用Java的开发者都知道Java字节码是在JRE中运行(JRE: Java 运行时环境)。JVM则是JRE中的核心组成部分,承担分析和执行Java字节码的工作,而Java程序员通常并不需要深入了解JVM运行情况就可以开...

540

SAP BASIS运维之三方SSL证书导入

事情的起因是我司SAP使用的SSL证书即将要到期了(上一个的SAP BASIS也辞职了),需要进行证书的更换。如上图所示,我司的证书有效期到2024年4月30日到期,需要提前预防并更换,防止过期后导致接口和访问出现问题。9.在弹出的框中,选择我们在第5个步骤中导出的转换结果存储地址,并选择导出的转换文件,点打开。12.最后一步也是关键的一步,不然就会无法更新证书,再点击左上角的个人安全环境,点另存为。10.在打开后的弹窗中,输入我们在第4个步骤中设置的密码。6.经过以上步骤后,我们获得了最终的证书文件。

fegda的专栏 1885

大模型的实践应用31-基于通义千问大模型改进台风和海浪预测研究,利用机器学习与通义千问结合的思路实现对台风和海浪预测分析

通义千问大模型是阿里巴巴云推出的一款大规模语言模型,旨在通过强大的自然语言处理能力提供更广泛的服务。从最初的构想到如今的广泛应用,通义千问的发展见证了人工智能领域尤其是自然语言处理技术的巨大进步。自发布以来,通义千问不断迭代升级,不仅在规模上实现了飞跃式的增长,在性能方面也得到了显著提升。本次研究尝试将通义千问强大的自然语言处理能力与经典的时间序列预测算法相结合,旨在提高对未来天气状况预测的精度。具体来说,首先使用通义千问生成高质量的文字描述来增强特征表达力;

微学AI的博客 935

java代码解析Double 浮点的存储结构

Java 浮点双精度Double的数据结构,以及计算方式

u011238098的博客 1418

北斗导航 | 基于LSTM-KF融合的北斗卫星定位算法研究框架

针对北斗卫星导航系统在复杂环境下存在的多路径效应、非视距传播等问题,提出一种基于长短期记忆网络(LSTM)与卡尔曼滤波(KF)的组合定位算法。通过LSTM网络建模定位误差的非线性特征,结合卡尔曼滤波实现动态噪声抑制,构建"粗定位-LSTM校正-卡尔曼滤波优化"的三级处理架构。实验表明,融合算法较传统方法定位精度提升42.7%,均方根误差降低至1.2米。

尘世冰封的专栏 922

java 虚拟机内存区域_深入理解Java虚拟机:JVM内存区域

线程独占区程序计数器(Program Counter Register)程序计数器是一块较小的内存空间,它可以看作是当前线程所执行的字节码的信号指示器。如果线程执行的是Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址。如果正在执行的是native方法,这个计数器的值为undefined。此区域是唯一一个在Java虚拟机规范中没有规定任何OutOfMemoryError情况的区域。J...

weixin_39938269的博客 79

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

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

ssm框架搭建

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

java虚拟机和内存的关系_【深入理解Java虚拟机】JVM内存区域

JVM内存区域JDK1.8前后,JVM内存区域的变化一、JDK1.8前二、JDK1.8之后线程共享一、堆Java 虚拟机所管理的内存中最大的一块,Java 堆是所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例以及数组都在这里分配内存。为什么说几乎呢?答:Java世界中“几乎”所有的对象都在堆中分配,但是,随着JIT编译期的发展与逃逸分析技术逐...

weixin_42514889的博客 578

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

深入理解 Java 虚拟机 (一) JVM 内存区域

一、概述 对于 Java 程序员来说,在虚拟机自动内存管理机制下,不再需要像 C/C++程序开发程序员这样为每一个 new 操作去写对应的 delete/free 操作,不容易出现内存泄漏和内存溢出问题。正是因为 Java 程序员把内存控制权利交给 Java 虚拟机,一旦出现内存泄漏和溢出方面的问题,如果不了解虚拟机是怎样使用内存的,那么排查错误将会是一个非常艰巨的任务。 ...

南桥听雨声 229

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

深入理解JVM虚拟机(二)Java内存区域

深入理解JVM虚拟机(二)Java内存区域 一 概述 对于 Java 程序员来说,在虚拟机自动内存管理机制下,不再需要像 C/C++程序开发程序员这样为每一个 new 操作去写对应的 delete/free 操作,不容易出现内存泄漏和内存溢出问题。正是因为 Java 程序员把内存控制权利交给 Java 虚拟机,一旦出现内存泄漏和溢出方面的问题,如果不了解虚拟机是怎样使用内存的,那么排查错误将会是一...

Tong_Nan的博客 269

深入理解JVM--深入理解虚拟机之Java内存区域

深入理解JVM--深入理解虚拟机之Java内存区域概述Java程序执行流程运行时数据区域 概述 对于Java程序员来说,在虚拟机自动内存管理机制下,不再需要像C/C++程序开发程序员这样为内一个new 操作去写对应的delete/free操作,不容易出现内存泄漏和内存溢出问题。正是因为Java程序员把内存控制权利交给Java虚拟机,一旦出现内存泄漏和溢出方面的问题,如果不了解虚拟机是怎样使用内存的...

wuzhenwei0419的博客 260

深入理解JVM虚拟机——Java内存区域

Java内存区域与内存溢出异常 一、运行时数据区域 Java虚拟机所管理的内存主要是如下几块五块区域 方法区、堆、虚拟机栈、本地方法栈、程序计数器 1.1、程序计数器 这个区域是唯一一个没有规定OutOfMemoryError 线程私有的,即每个线程都会创建一个自己的程序计数器 生命周期同线程生命周期 作用:指示下一条要执行的字节码 字节码解释器在执行时通过改变计数器的值来选择下一条要执行的字节码 注:如果线程在执行的是java方法,计数器记录的是正在执行的虚拟机字节码指令的地址

relosy的博客 133

深入理解JVM虚拟机(一)Java内存区域的划分

Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则依赖用户线程的启动和结束而建立和销毁。 程序计数器 Java虚拟机栈 本地方法栈 Java堆 方法区 运行时异常 直接内存 ...

Genjicoo的博客 224

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

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

qq_31957747的博客 694

深入理解Java虚拟机:Jvm总结-Java内存区域与内存溢出异常

对于C、C++程序开发来说,程序员需要维护每一个对象从开始到终结。Java的虚拟自动内存管理机制,让java程序员不需要手写delete或者free代码,不容易出现内存泄漏和内存溢出问题,但是如果出现了内存泄漏和溢出的问题,就需要知道虚拟机是怎样使用内存的,才能排查错误并且修正。本章主要讲明Java虚拟机内存的各个区域,各个区域的作用、服务对象,以及常见的异常。

Oceáno的博客 1770

java中jvm虚拟机详解_深入理解Java虚拟机(一) -- 详解JVM内存区域

前言在周志明老师的《深入理解Java虚拟机:JVM高级特性和最佳实践》中有下面一段话:Java与C++之间有一堵有内存动态分配和垃圾收集技术所围成的“高墙”,墙外的人想进去,墙里面的人却想出来。Java语言最大的特性之一就是安全,因为内存的控制权属于Java虚拟机(Java Virtual Machine,简称JVM),所以不容易出现内存泄漏和溢出问题。而这也恰恰导致了一旦出现内存泄漏或内存溢出的...

weixin_31517893的博客 228

深入理解Java虚拟机JVM内存区域与垃圾回收机制全解析

Java虚拟机(JVM)作为Java技术体系的核心,是每一位Java开发者必须深入理解的关键组件。它不仅承担着执行Java字节码的任务,更通过自动化内存管理与垃圾回收机制,极大地简化了开发者的工作。本文将系统性地解析JVM的内存区域划分与垃圾回收机制,帮助读者构建完整的知识体系。深入理解JVM内存区域划分与垃圾回收机制对于Java开发者至关重要。

Mokou_Jiang的博客 704

深入理解JVM虚拟机:(一)Java内存区域

运行时数据区域 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分成若干个不同的数据区域,这些数据区域都有各自的用途,以及创建和销毁时间,Java虚拟机所管理的内存将会包括以下几个运行时数区域。 1.程序计数器 程序计数器是一块比较小的内存空间,它可以看做是当前线程所执行的字节码指令的行号指示器。在虚拟机的概念模型里,字节码解释器工作时就是通过改变这个计数器的值来选取下一条...

wind_cp的博客 229

深入理解Java虚拟机(1)——JVM内存区域

一.运行时数据区域1.Java虚拟机执行Java程序的过程会把它管理的内存划分为若干个不同的数据区域。其中这些区域包括:方法区、堆、虚拟机栈、本地方法栈、程序计数器、直接内存。线程共享:方法区(方法区中的常量池)、堆线程私有:虚拟机栈、本地方法栈、程序计数器直接内存2.程序计数器(线程私有)    一块较小的内存空间,被视为当前线程所执行的字节码的行号指示器。字节码解释器工作时就是通过改变程序计数...

Muyu_Z的博客 281
上一篇: 深入理解Java虚拟机--垃圾回收机制
下一篇: 深入理解Java虚拟机--类加载机制
Double____C
博客等级 码龄8年 92粉丝 79原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值