【读书笔记】 深入理解JVM第三版 JVM 运行时数据区
JVM 内存管理
- 堆 (Heap)线程共享
- 方法区 (Method Area)线程共享
- 虚拟机栈(VM Stack) 线程私有
- 本地方法栈 (Native Method Stack)线程私有
- 程序计数器 (Program Counter Register)线程私有

虚拟机栈
生命周期和线程相同。Java 方法执行的线程内存模型:每个方法被执行时,Java 虚拟机都会同步创建一个栈帧 (Stack Frame)用于存放局部变量表、操作数栈、动态连接、方法出口等信息。

- 每个方法的从调用到执行完成,就对应着一个栈帧在虚拟机栈中入栈和出栈的过程
- 通常说的 "栈" 是指虚拟机栈或者虚拟机栈中的局部变量表。
- 局部变量表:存放了编译期可知的各种 Java 虚拟机 基本数据类型、对象引用和 returnAddress 类型(指向字节码指令的地址),存放方法的参数和方法内定义的局部变量
- 局部变量槽:这些数据类型局部变量表中的存储空间以局部变量槽(Slot)表示,其中64位长度的 long 和 double 类型的数据会占用两个变量槽,其余的数据类型只占用一个。
- 其所需内存空间在编译器就分配完成。
- StackOverflowError:如果线程请求的栈深度大于虚拟机栈的允许深度抛出的异常
- OutOfMemoryError:当栈无法申请到足够的内存时抛出的异常,可以是使用 "-Xss" 参数来调整栈内存
本地方法栈
和虚拟机栈的结构一样,区别在于虚拟机栈调用的是Java方法,而本地方法栈调用的是本地(Native)方法。HotSpot虚拟机干脆将两者结合在一起了
程序计数器
当前线程所执行的字节码的行号指示器,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,它是程序控制流的指示器,分支、循环、跳转、异常处 理、线ss程恢复等基础功能都需要依赖这个计数器来完成。
JVM 中的多线程是通过线程轮流切换、分配处理器执行时间的方式来实现的。在任何确定的时刻,一个处理器指挥执行一条线程中的指令。为了线程切换恢复到正确的位置,每条线程都需要独立的程序计数器,各线程间相互独立,互不影响,这部分的类内存区域为 线程私有
- 线程执行的是 JAVA 方法,计数器记录的是正在执行的虚拟机字节码指令的地址
- 线程执行的是 本地方法,计数器的值则应该为空(Undefinded)
- 该区域没有规定任何Out Of Memory Error 的区域
堆
是被线程共享的一块内存空间,虚拟机所管理的最大内存,在虚拟机启动时创建。创建的对象和数组都保存在Java堆内存中,也是垃圾收集器进行垃圾回收的最重要的区域。
- VM采用的分代收集算法,从GC的角度可以细分为:新生代(Eden区、From Survivor区和 To Survivor区)和老年区
- 内存分配:线程共享的Java堆上可以划分多个线程私有的 分配缓存区(Thread Local Allocation Buffer, TLAB),以提升效率,这样的做的目的是使得内存更好的回收,或更快的分配内存。
- 参数扩展:JAVA堆可以实现固定大小,也可以扩展(通过-Xmx 和 -Xms设定),如果JAVA堆中没有内存完成实例分配,并且堆也无法扩展时,JVM将会抛出 OutOfMemoryError 异常
方法区
用于存储已被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等数据
- 永久代有-XX: MaxPermSize 上限
- JDK6 HotSpot 放弃永久代,采用本地内存;
- JDK7 将原本永久代的字符串常量池、静态变量等移除;
- JDK8 完成废弃永久代,采用本地内存来实现的元空间(Meta-space),把JDK7 中的永久代和其他(主要是类型信息)全部移到原空间。
- OutOfMemoryError:如果方法区无法满足新的内存分配的需求时
运行时常量池
属于方法区的一部分。
- Class 文件中除了有类的版本、字段、方法、接口的描述信息外,还有一项信息就是运行时常量表
【读书笔记】 深入理解JVM第三版 JVM 运行时数据区的更多相关文章
- jvm系列(一)运行时数据区
C++程序员肩负着每一个对象生命周期开始到终结的维护责任.Java程序员则可以借助自动内存管理机制,不需要自己手动去释放内存.由虚拟机进行内存管理,不容易出现内存泄漏和内存溢出的问题,但是一旦出现这些 ...
- JVM 专题十二:运行时数据区(七)对象的实例化内存布局与访问定位
1. 对象的实例化 1.1 创建对象的方式 new 最常见的方式 变形1 : Xxx的静态方法 变形2 : XxBuilder/XxoxFactory的静态方法 Class的newInstance() ...
- 【深入理解Java虚拟机】Java虚拟机运行时数据区
Java虚拟机运行时数据区 线程私有 程序计数器 1.当前线程所执行的字节码的行号指示器. 2.唯一不会发生OutOfMemoryError的区域 3.如果执行的是java方法,计数器值为虚拟机字节码 ...
- Jvm基础(1)-Java运行时数据区
最近在看<深入理解Java虚拟机>,里面讲到了Java运行时数据区,这是Jvm基本知识,把读书笔记记录在此.这些知识属于常识,都能查到的,如果我有理解不对的地方,还请指出. 首先把图贴上来 ...
- JVM详解(四)——运行时数据区-堆
一.堆 1.介绍 Java运行程序对应一个进程,一个进程就对应一个JVM实例.一个JVM实例就有一个运行时数据区(Runtime),Runtime里面,就只有一个堆,一个方法区.这里也阐述了,方法区和 ...
- jvm内存模型(运行时数据区)
运行时数据区(runtime data area) jvm定义了几个运行时数据区,这些运行时数据区存储的数据,供开发者的应用或者jvm本身使用.按线程共享与否可以分为线程间共享和线程间独立. 线程间独 ...
- jvm入门及理解(三)——运行时数据区(程序计数器+本地方法栈)
一.内存与线程 内存: 内存是非常重要的系统资源,是硬盘和cpu的中间仓库及桥梁,承载着操作系统和应用程序的实时运行.JVM内存布局规定了JAVA在运行过程中内存申请.分配.管理的策略,保证了JVM的 ...
- 【JVM第三篇--运行时数据区】程序计数器、虚拟机栈、本地方法栈
写在前面的话:本文是在观看尚硅谷JVM教程后,整理的学习笔记.其观看地址如下:尚硅谷2020最新版宋红康JVM教程 一.运行时数据区 我们在编写Java程序时,使用JVM的流程主要如下所示: 虚拟机在 ...
- 深入理解java:1.3.1 JVM内存区域的划分(运行时数据区)
学习Java GC机制,可以帮助我们在日常工作中 排查各种内存溢出或泄露问题,解决性能瓶颈,达到更高的并发量,写出更高效的程序. 我们将从4个方面学习Java GC机制, 1,内存是如何分配的: 2, ...
- jvm入门及理解(五)——运行时数据区(虚拟机栈)和本地方法接口
一.虚拟机栈背景 由于跨平台性的设计,java的指令都是根据栈来设计的.不同平台CPU架构不同,所以不能设计为基于寄存器的. 优点是跨平台,指令集小,编译器容易实现,缺点是性能下降,实现同样的功能需要 ...
随机推荐
- C#上位机与PLC通信心跳的实现方法
-Begin- 大家好!我是付工.众所周知,在工业自动化控制系统中,上位机与下位机之间的通信是实现自动化生产的关键环节之一.为了确保通信的稳定性和可靠性,我们通用会采用一种被称为[心跳机制]的方法,它 ...
- CentOS7 控制台上安装运行 vmware workstation 备忘录
目标平台 CentOS 7.5.1804 无桌面,要跑个 Ubuntu.vmx 1.安装依赖库 yum -y install perl gcc kernel-devel libX11 libXiner ...
- php 生成唯一订单号
php 生成唯一订单号4种方法 第一种 private function doCreateOrderNumber($time){ $i=1; $dd = date('Ymd',$time); $a ...
- linux tracepoint增加
引入tracepoint的背景 当需要获取内核的debug信息时,通常你会通过以下printk的方式打印信息: void trace_func() { //-- printk("输出信息&q ...
- 直播预告 | YashanDB 2023年度发布会正式定档11月8日,邀您共同见证国产数据库发展实践!
11月8日,YashanDB 2023年度发布会将于云端直播开启,发布会以 「惟实·励新」 为主题,邀请企业用户.合作伙伴.广大开发者共同见证全新产品与解决方案.届时发布会将在墨天轮社区同步进行,欢迎 ...
- .Net 的扩展方法
// 扩展方法 // ps:js中的扩展方法 比如 给数组定义一个自定义的全局的方法 使用 prototype (原型链) // .Net 给 string 添加一些扩展方法 String 是一个密封 ...
- MYSQL存储过程-练习3 repeat循环
MYSQL存储过程-练习3 repeat循环 1 DELIMITER $$ 2 3 CREATE PROCEDURE `sp_repeat`() 4 BEGIN 5 DECLARE i INT; 6 ...
- 00 你想要学习的 AI+Python,捷径在这里
博客配套视频链接: https://space.bilibili.com/383551518?spm_id_from=333.1007.0.0 b 站直接看 配套 github 链接:https:// ...
- 二叉树遍历Java版(前中后序的递归,迭代,Morris以及两种特殊的先序遍历)
二叉树的遍历 先序 /** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode l ...
- redis配置文件剖析
解析配置文件 #是否在后台运行:no:不是后台运行 daemonize yes #是否开启保护模式,默认开启.要是配置里没有指定bind和密码.开启该参数后,redis只会本地进行访问,拒绝外部访问. ...