Java 虚拟机
基于深入Java虚拟机这本书来学习JVM的底层原理
@另维吖
种一棵树最好的时间是十年前,其次是现在。
展开
-
JVM中运行数据区详述-方法区(元空间)
栈、堆、方法区的交互关系 运行时数据区结构图 方法区的理解 方法区在哪里 《Java 虚拟机规范》中明确说明:”尽管所有的方法区在逻辑上是属于堆的一部分,但一些简单的实现可能不会去进行垃圾收集或者进行压缩。“但对于 HotSpot JVM 而言,方法区还有一个别名叫 Non-Heap(非堆),目的就是要和堆分开。所以,方法区可以看作是一块独立于 Java 堆的内存空间 方法区的基本理解 方法区与堆一样,是各个线程共享的内存区域。方法区在 JVM 启动的时候被创建,并且它的实际的物理内存空间中和 J原创 2020-06-26 01:09:17 · 1478 阅读 · 0 评论 -
JVM 运行数据区详述-堆
文章目录堆的核心概念年轻代与老年代图解对象分配过程Minor GC、Major GC、Full GC堆空间分代思想内存分配策略为对象分配内存:TLAB小结堆空间的参数设置堆是分配对象的唯一选择吗 堆的核心概念 Java 堆区在 JVM 启动时被创建,空间大小就确定,但是堆内存的大小是可以调节的。《Java 虚拟机规范》规定,堆可以处于物理上布莱纳许的内存空间中,但在逻辑上它应该被视为连续的。所有线程共享 Java 堆。数组和对象可能永远不会存储在栈上,因为栈帧中保存引用,这个引用指向对象或数组在堆中的位置原创 2020-06-24 22:04:34 · 308 阅读 · 0 评论 -
本地方法栈和本地方法接口
文章目录本地方法接口本地方法栈 (Native Method Stack) 本地方法接口 什么是本地方法 一个本地方法就是一个 Java 调用非 Java 代码的接口,一个本地方法的实现由非Java 语言实现,比如 C 语言。这个特征并非 Java 特有,很多编程语言都有这一机制。 在定义一个本地方法时,并不提供实现体(有些想定义一个接口),因为其实体是由非 java 语言在外面实现 本地接口的作用是融合不同的编程语言为 Java 所用,它的初衷是融合 C/C++ 程序。 为什么要使用 Native原创 2020-06-24 20:35:08 · 444 阅读 · 0 评论 -
JVM 中运行时数据区之虚拟机栈详述
文章目录虚拟机栈概述局部变量表操作数栈代码追踪栈顶缓存动态链接方法地调用:解析与分派方法返回地址一些附加信息 虚拟机栈概述 虚拟机栈出现的背景 由于跨平台地设计,Java地指令都是根据栈来设计地,不同平台 CPU 架构不同,所以不设计为基于寄存器的 这样的优点是跨平台,指令集小,编译器容易实现,缺点是性能下降,实现同样的功能需要更多的指令。 另外栈是运行时的单位,堆是存储的单位,栈能解决程序的运行问题,即程序如何执行,或者说如何处理数据,堆解决的是数据存储的问题。 虚拟机栈的基本内容 Java 虚拟机栈原创 2020-06-24 15:20:08 · 438 阅读 · 0 评论 -
JVM 中运行时数据区之程序计数寄存器(PC 计数器)
文章目录PC Register 介绍作用两个常见问题使用 PC 寄存器存储字节码指令地址有什么用?PC 寄存器为什么会被设定为线程私有? PC Register 介绍 PC Register (Program Counter Register) JVM 中的程序计数寄存器中,Register 的命名源于 CPU 的寄存器,寄存器存储指令相关的现场信息。CPU 只有把数据装在到寄存器才能够运行。 这里,并非时广义上所指的物理寄存器,获取将其翻译为 PC 计数器 (或指令计数器) 会更加贴切(也成为程序钩子)原创 2020-06-23 22:55:22 · 322 阅读 · 0 评论 -
JVM 运行时数据区及线程概述
内存是非常重要的系统资源,是硬盘和 CPU 的中间仓库及桥梁,c二号能够在着操作系统和应用程序的实时运行。JVM 内存布局规定了 Java 在运行过程中内存申请、分配、管理的策略,保证了 JVM 的高效稳定运行。不同的 JVM 对于内存的划分方式和管理机制存在着部分差异。结合 JVM 规范,以下仅探讨经典的 JVM 内存布局。(如上图蓝色框内,详细会在后面的 blog 一一介绍) Java 虚拟机定义了若干种程序运行期间会使用到的运行时数据区,其中一些会随着虚拟机启动而创建,随着虚拟机退出而销毁。另外一.原创 2020-06-23 21:51:43 · 197 阅读 · 0 评论 -
简述双亲委派机制
Java 虚拟机对 class 文件采用的是按需加载的方式,也就是说当需要使用该类时才会将它的 class 文件加载到内存生成 class 对象。而且加载某个类的 class 文件时,Java 虚拟机采用的双亲委派模式,即把请求交给由父类处理,它是一种任务委派模式。 工作原理 如果一个类加载器收到了类加载请求,它并不会自己去加载,而是把这个请求委托给父类的加载器去执行 如果父类记载其还存在其福哦类加载器,则进一步向上委托,依次递归,请求最终将到达顶层的启动类加载器 如果父类加载器可以完成类加载的任务,就成原创 2020-06-23 17:02:58 · 584 阅读 · 0 评论 -
图解类的加载过程及加载器的概述
加载: 通过一个类的全限定名获取定义此类的二进制字节流 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构 在内存中生成一个代表这个类的java.lang.Class对象 ,作为方法区这个类的各种数据的访问入口 链接: 验证: 目的在于确保Class文件的字节流中包含信息符合当前虚拟机要求,保证被加载类的正确 性,不会危害虚拟机自身安全。 主要包括四种验证,文件格式验证,元数据验证,字节码验证,符号引用验证。 准备: 为类变量分配内存并且设置该类变量的默认初始值,即零值。 这里不包含用final修原创 2020-06-23 12:17:16 · 638 阅读 · 0 评论 -
细说逃逸分析及基于逃逸分析的优化
Java 中 Iterable 对象的 foreach 循环遍历是一个语法糖,Java 编译器会将该语法编译为调用 Itreable 对象的 iterator 方法,并用所返回的 Iterator 对象的 hasNext 以及 next 方法,来完成遍历。 public void forEach(ArrayList<Object> list, Consumer<Object> f) { for (Object obj : list) { f.accept(obj);原创 2020-06-05 21:29:12 · 740 阅读 · 0 评论 -
标记阶段和清除阶段相关垃圾回收算法
引用技术法和可达性分析 垃圾回收:顾名思义就是将已经分配除去的,但却不再使用的内存回收回来,以便能够再次分配。在 Java 虚拟机的语境下,垃圾指的是死亡的对象占据的堆空间。那么如何辨别一个对象是否可回收? 引用计数法 (reference counting),它的做法是为每个对象添加一个引用计数器,用来统计指向该对象的引用个数。一旦某个对象的引用计数器为 0,则说明该对象已经死亡,可以回收 具体实现:如果有一个引用,被赋值为某一对象,那么将该对象的引用计数器 +1。如果一个指向某一对象的引用,被赋值为其他原创 2020-06-05 20:38:38 · 357 阅读 · 0 评论 -
JVM 构造对象及对象的内存布局
文章目录压缩指针字段重排列 Java 程序中,有多种新建对象的方式,除了常见的 new 语句之外,还可以通过反射机制、Object.clone方法、反序列化以及 Unsafe.allocateInstance 方法来新建对象。其中,Object.clone 方法和反序列化通过直接赋值已有的数据,来初始化创建对象的实例字段。Unsafe.allocateInstance 方法则没有初始化字段,而 new 语句和反射机制,则是通过调用构造器来初始化实例字段。 以 new 语句为例,它编译而成的字节码将包含用来请原创 2020-05-26 21:13:47 · 207 阅读 · 0 评论 -
Java 虚拟机是如何执行方法调用的
文章目录JVM 的静态绑定和动态绑定调用指令地符号引用小结 JVM 的静态绑定和动态绑定 Java 虚拟机识别方法的关键在于类名、方法名以及方法描述符(method descriptor)。其中方法描述符,它是由方法的参数类型以及返回类型所构成。在同一个类中,如果同时出现多个名字相同且描述也相同的方法,那么 Java 虚拟机会在类的验证阶段报错。 其实 Java 虚拟机与 Java 语言不同,它并不限制名字与参数类型相同,但返回类型不同的方法出现在同一个类中,对于调用这些方法的字节码来说,由于字节码所附带的原创 2020-05-26 21:11:34 · 303 阅读 · 0 评论 -
简述Java 虚拟机加载 Java 类的三步
文章目录加载 关于 Java 虚拟机中的类加载,从 class 文件到内存中的类,按先后顺序需要经过加载、链接以及初始化三大步骤。其中,链接过程中同样需要验证;而内存中的类没有经过初始化也不能使用。那么,是不是所有的了 Java 类都需要经过这几步呢? Java 语言的类型可以分为基本类型(primitive types) 和引用类型(reference types)。而应用类型有可以细分为四类:类、接口、数组类和泛型参数。由于泛型参数会在编译过程中被擦出,所以 Java 虚拟机实际上只有前三种。在类、接口原创 2020-05-26 11:05:30 · 342 阅读 · 0 评论 -
Java基本类型在 JVM 中的实现
文章目录Java 的基本类型关于 Java 虚拟机的boolean 类型声明为基本类型的局部白能力能否存储超出其范围的值?Java 基本类型的大小小结 Java 的基本类型 类型 值域 默认值 虚拟机内部符号 boolean {false,true} false Z byte [-128,127] 0 B short [-32768,32767] 0 S char [0,65535] ‘\u0000’ C int [-2^31, 2^31-1] 0 I long [-2^原创 2020-05-25 20:22:54 · 345 阅读 · 0 评论 -
JVM 具体是怎样运行 Java 字节码的
文章目录为什么 Java 要在虚拟机里运行?Java 虚拟机具体是怎样运行 Java 字节码的? Java 代码有很多种不同的运行方式,可以在开发工具种运行;可以双击执行 jar 文件运行;可以在命令行种运行;甚至可以在网页种运行,这些都离不开 JRE,也就是 Java运行环境。(包含 Java 程序的必须组件,即 Java 虚拟机以及 Java 核心类库等) 为什么 Java 要在虚拟机里运行? Java 的语法很复杂,抽象程度高,直接在硬件上运行这种复杂的程序并不惜那是,所以在在运行之前需要进行转换。原创 2020-05-25 17:46:55 · 1488 阅读 · 0 评论