随笔分类 - Java 虚拟机
摘要:JVM 参数设置入门案例 JVM 的内存参数众多,但是在实际应用中主要关注堆内存的大小设置及堆内存中新生代和老年代的大小设置,下面看一个简单的 JVM 启动参数设置案例: java -server -Xms3g -Xmx3g -XX:NewSize=1g -XX:MetaspaceSize=128m
阅读全文
摘要:本书部分摘自《深入理解 Java 虚拟机第三版》 概述 前面讲过前端编译是将 Java 源代码编译成 Class 字节码,那么后端编译就对应把 Class 文件转换成与本地机器相关的二进制机器码的过程。然后 JVM 把每一条要执行的字节码交给解释器,翻译成对应的机器码,由解释器执行,Java 程序就
阅读全文
摘要:本文部分摘自《深入理解 Java 虚拟机第三版》 概述 前端编译器(也叫编译器的前端)中的前端是指把 Java 文件转变为 Class 字节码文件的过程,顾名思义,前端编译器就是完成这一部分编译工作的。 前端编译器对代码的运行效率几乎没有任何优化措施可言,Java 虚拟机设计团队选择把对性能的优化全
阅读全文
摘要:本文部分摘自《深入理解 Java 虚拟机第三版》 概述 方法调用并不等同于方法中的代码被执行,方法调用阶段唯一的任务就是确定被调用方法的版本(即调用哪一个方法)。之前讲过,一切方法调用在 Class 文件里面都是以符号引用的形式存储,而非方法在实际运行时内存布局中的入口地址(直接引用)。这个特性给
阅读全文
摘要:本文部分摘自《深入理解 Java 虚拟机》 执行引擎 执行引擎是 Java 虚拟机核心的组成部分之一,作用就是用来执行字节码。在 Java 虚拟机规范中执行引擎只是一个概念模型,不同的虚拟机可以有不同的实现,通常会有解释执行(通过编译器执行)和编译执行(通过即时编译器产生本地代码执行)两种选择,或者
阅读全文
摘要:本文部分摘自《深入理解 Java 虚拟机第三版》 概述 Java 虚拟机把描述类的数据从 Class 文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的 Java 类型,这个过程被称作虚拟机的类加载机制 与那些在编译时需要进行连接的语言不同,在 Java 语言里面,类
阅读全文
摘要:本文部分摘自《深入理解 Java 虚拟机》 简介 Java 虚拟机的指令由操作码 + 操作数组成,其中操作码是代表某种特定操作含义的数字,长度为一个字节,而操作数就是此操作所需的一个或多个参数。由于 Java 虚拟机采用面向操作数栈而非寄存器的架构,所以大多数指令都不包括操作数,只有一个操作码 既然
阅读全文
摘要:本文部分摘自《深入理解 Java 虚拟机第三版》 概述 我们知道,Java 具有跨平台性,其实现基础就是虚拟机和字节码存储格式。Java 虚拟机不与 Java 语言绑定,只与 Class 文件所关联。Java 虚拟机作为一个通用的、与机器无关的执行平台,任何语言都可以将 Java 虚拟机作为它们的运
阅读全文
摘要:本文部分摘自《深入理解 Java 虚拟机第三版》 基础故障处理工具 Java 开发人员肯定都知道 JDK 的 bin 目录下有许多小工具,这些小工具除了用于编译和运行 Java 程序外,打包、部署、签名、调试、监控、运维等各种场景都可能会见到它们的影子 本文主要介绍的是用于监视虚拟机运行状态和进行故
阅读全文
摘要:本文部分摘自《深入理解 Java 虚拟机第三版》 概述 衡量垃圾收集器的三项指标分别是:内存占用、吞吐量和延迟。这三者共同构成一个“不可能三角”,即一款优秀的收集器最多可以同时达成其中两项 随着硬件性能的提升,对内存占用和吞吐量也有所助益,但对延迟却并非如此。比如内存扩大了,对延迟反而会带来负面效果
阅读全文
摘要:本文部分摘自《深入理解 Java 虚拟机第三版》 根节点枚举 在之前关于可达性分析算法的介绍中我们讲过,我们需要先找出可固定作为 GC Roots 的节点,然后沿着引用链去寻找那些无用的垃圾对象。GC Roots 节点一般在全局性引用(例如常量和类静态属性)与执行上下文(例如栈帧中的本地变量表)中,
阅读全文
摘要:本文部分摘自《深入理解 Java 虚拟机第三版》 CMS 收集器 1. 概述 CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。由于大部分 Java 应用主要集中在互联网网站以及基于浏览器的 B/S 系统的服务端,这类应用通常会较为关注服务的响应速
阅读全文
摘要:本文部分摘自《深入理解 Java 虚拟机第三版》 概述 如果说收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的实践者。Java 虚拟机规范中对垃圾收集器的实现做出规定,因此不同的厂商、不同版本的虚拟机所包含的垃圾收集器各有不同。所谓经典就是在 JDK7 Update 4 以后,JDK11 发
阅读全文
摘要:本文摘自深入理解 Java 虚拟机第三版 垃圾收集发生的区域 之前我们介绍过 Java 内存运行时区域的各个部分,其中程序计数器、虚拟机栈、本地方法栈三个区域随线程共存亡。栈中的每一个栈帧分配多少内存基本上在类结构确定下来时就已知,因此这几个区域的内存分配和回收都具有确定性,不需要考虑如何回收的问题
阅读全文
摘要:本文摘自深入理解 Java 虚拟机第三版 对象的创建 Java 是一门面向对象的语言,Java 程序运行过程中无时无刻都有对象被创建出来。从语言层面看,创建对象只是一个 new 关键字而已,而在虚拟机中,对象(仅限于普通 Java 对象,不包括数组和 Class 对象等)的创建又是怎么一个过程呢?
阅读全文
摘要:本文摘自深入理解 Java 虚拟机第三版 概述 Java 虚拟机在执行 Java 程序的过程中会把它所管理的内存划分为若干个不同的数据区域,这些区域有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而一直存在,有的区域则是依赖用户线程的启动和结束而创建和销毁。因此,我们可以根据这个特点
阅读全文