
JVM
文章平均质量分 83
Java虚拟机
吴声子夜歌
个人学习记录
展开
-
深入理解Java虚拟机(第三版)-- 运行时栈帧结构
运行时栈帧结构Java虚拟机以方法作为最基本的执行单元,“栈帧”(Stack Frame)则是用于支持虚拟机进行方法调用和方法执行背后的数据结构,它也是虚拟机运行时数据区中的虚拟机栈(Virtual Machine Stack)的栈元素。栈帧存储了方法的局部变量表、操作数栈、动态连接和方法返回地址等信息,如果读者认真阅读过第6章,应该能从Class文件格式的方法表中找到以上大多数概念的静态对照...原创 2020-04-06 13:53:11 · 405 阅读 · 0 评论 -
深入理解Java虚拟机(第三版)-- 类加载器
类加载器Java虚拟机设计团队有意把类加载阶段中的“通过一个类的全限定名来获取描述该类的二进制字节流”这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需的类。实现这个动 作的代码被称为“类加载器”(Class Loader)。类加载器可以说是Java语言的一项创新,它是早期Java语言能够快速流行的重要原因之一。类加载器最初是为了满足Java Applet的需求而设计出...原创 2020-04-05 23:23:43 · 262 阅读 · 0 评论 -
深入理解Java虚拟机(第三版)-- 虚拟机类加载时机、过程
虚拟机类加载机制Java虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最 终形成可以被虚拟机直接使用的Java类型,这个过程被称作虚拟机的类加载机制。与那些在编译时需 要进行连接的语言不同,在Java语言里面,类型的加载、连接和初始化过程都是在程序运行期间完成 的,这种策略让Java语言进行提前编译会面临额外的困难,也会让类加载时稍微增加一些性能开销, 但...原创 2020-04-05 22:36:22 · 333 阅读 · 0 评论 -
深入理解Java虚拟机(第三版)-- 字节码指令简介
字节码指令简介Java虚拟机的指令由一个字节长度的、代表着某种特定操作含义的数字(称为操作码,Opcode) 以及跟随其后的零至多个代表此操作所需的参数(称为操作数,Operand)构成。由于Java虚拟机采用面向操作数栈而不是面向寄存器的架构(这两种架构的执行过程、区别和影响将在第8章中探讨),所 以大多数指令都不包含操作数,只有一个操作码,指令参数都存放在操作数栈中。字节码指令集可算是一种...原创 2020-04-05 20:00:36 · 402 阅读 · 0 评论 -
深入理解Java虚拟机(第三版)-- Class类文件结构
Class类文件的结构Java技术能够一直保持着非常良好的向后兼容性,Class文件结构的稳定功不可没,任何一门程序 语言能够获得商业上的成功,都不可能去做升级版本后,旧版本编译的产品就不再能够运行这种事 情。本章所讲述的关于Class文件结构的内容,绝大部分都是在第一版的《Java虚拟机规范》(1997年 发布,对应于JDK 1.2时代的Java虚拟机)中就已经定义好的,内容虽然古老,但时至今...原创 2020-04-05 15:59:44 · 638 阅读 · 0 评论 -
深入理解Java虚拟机(第三版)-- 垃圾收集器日志、垃圾收集器参数
垃圾收集器日志阅读分析虚拟机和垃圾收集器的日志是处理Java虚拟机内存问题必备的基础技能,垃圾收集器日 志是一系列人为设定的规则,多少有点随开发者编码时的心情而定,没有任何的“业界标准”可言,换 句话说,每个收集器的日志格式都可能不一样。除此以外还有一个麻烦,在JDK 9以前,HotSpot并没 有提供统一的日志处理框架,虚拟机各个功能模块的日志开关分布在不同的参数上,日志级别、循环 日志大小、...原创 2020-04-04 23:10:11 · 372 阅读 · 0 评论 -
深入理解Java虚拟机(第三版)--经典垃圾收集器
Serial收集器Serial收集器是最基础、历史最悠久的收集器,曾经(在JDK 1.3.1之前)是HotSpot虚拟机新生代收集器的唯一选择。大家只看名字就能够猜到,这个收集器是一个单线程工作的收集器,但它的“单线 程”的意义并不仅仅是说明它只会使用一个处理器或一条收集线程去完成垃圾收集工作,更重要的是强调在它进行垃圾收集时,必须暂停其他所有工作线程,直到它收集结束。“Stop The Wor...原创 2020-04-04 21:25:41 · 731 阅读 · 0 评论 -
深入理解Java虚拟机(第三版)-- HotSpot算法细节实现
根节点枚举我们以可达性分析算法中从GC Roots集合找引用链这个操作作为介绍虚拟机高效实现的第一个例子。固定可作为GC Roots的节点主要在全局性的引用(例如常量或类静态属性)与执行上下文(例如栈帧中的本地变量表)中,尽管目标明确,但查找过程要做到高效并非一件容易的事情,现在Java应用越做越庞大,光是方法区的大小就常有数百上千兆,里面的类、常量等更是恒河沙数,若要逐个检 查以这里为起源的引...原创 2020-04-04 20:00:16 · 1217 阅读 · 5 评论 -
深入理解Java虚拟机(第三版)-- 垃圾回收算法
标记-清除算法最早出现也是最基础的垃圾收集算法是“标记-清除”(M ark-Sweep)算法,在1960年由Lisp之父 John McCarthy所提出。如它的名字一样,算法分为“标记”和“清除”两个阶段:首先标记出所有需要回收的对象,在标记完成后,统一回收掉所有被标记的对象,也可以反过来,标记存活的对象,统一回收所有未被标记的对象。标记过程就是对象是否属于垃圾的判定过程,这在前一节讲述垃圾...原创 2020-04-04 17:37:40 · 268 阅读 · 0 评论 -
深入理解Java虚拟机(第三版)-- 判定对象存活算法、引用、回收方法区
引用记数法很多教科书判断对象是否存活的算法是这样的:在对象中添加一个引用计数器,每当有一个地方 引用它时,计数器值就加一;当引用失效时,计数器值就减一;任何时刻计数器为零的对象就是不可 能再被使用的。笔者面试过很多应届生和一些有多年工作经验的开发人员,他们对于这个问题给予的 都是这个答案。客观地说,引用计数算法(Reference Counting)虽然占用了一些额外的内存空间来进行计数,但它...原创 2020-04-03 23:35:24 · 1288 阅读 · 0 评论 -
深入理解Java虚拟机(第三版)-- 虚拟机中的对象
对象的创建当Java虚拟机遇到一条字节码new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,那必须先执行相应的类加载过程,本书第7章将探讨这部分细节。在类加载检查通过后,接下来虚拟机将为新生对象分配内存。对象所需内存的大小在类加载完成 后便可完全确定(如何确定将在2.3.2节中介绍),为对象分配空间...原创 2020-04-03 21:32:58 · 602 阅读 · 0 评论 -
深入理解Java虚拟机(第三版)--运行时数据区域
运行时数据区域Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域 有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而一直存在,有些区域则是 依赖用户线程的启动和结束而建立和销毁。根据《Java虚拟机规范》的规定,Java虚拟机所管理的内存 将会包括以下几个运行时数据区域,如图2-1所示。程序计数器程序计数器(Program Cou...原创 2020-04-03 19:53:28 · 292 阅读 · 0 评论 -
GC--算法详解
GC算法概述JVM进行GC和Full GC时,并非每次都对上面三个内存区域一起回收的,大部分时候回收的都是新生代。因此,GC按照回收的区域又分成了两种类型,一种是普通GC(mimor GC),一种是全局GC(major GC or Full GC)。minor Gc和Full GC的区别:普通GC(Minor GC):只针对新生代区域的GC,指发生再新生代的垃圾收集动作,因为大多数Jav...原创 2020-01-24 00:42:18 · 435 阅读 · 0 评论 -
GC--日志分析
GC日志设置VM参数打印GC日志:-XX:+PrintGCDetails打印GC日志:GC的日志是以替换的方式(>)写入的,而不是追加(>>),如果下次写入到同一个文件中的话,以前的GC内容会被清空。参数列表:-XX:+PrintGC 输出GC日志-XX:+PrintGCDetails 输出GC的详细日志-XX:+PrintGCTimeStamps 输出GC的时...原创 2020-01-23 19:41:29 · 294 阅读 · 0 评论 -
JVM--堆内存调优
堆参数Java7:Java8:JDK1.8之后将最初的永久代取消了,由元空间取代。元空间与永久代最大的区别在于:永久代使用的JVM的堆内存,但是Java8以后的元空间并不在虚拟机中而是使用本机物理内存。因为,默认情况下,元空间的大小仅受本地内存限制。类的元数据放入native memory,字符串池和类的静态变量放入java堆中,这样可以加载多少类的元数据就不再由MaxPermSi...原创 2020-01-23 19:16:40 · 320 阅读 · 0 评论 -
JVM--方法区(Method Area)
方法区供各线程共享的运行时内存区域。它存储了每一个类的结构信息,例如运行时常量池(Runtime Constant Pool)、字段和方法数据、构造函数和普通方法的字节码内容。上面说的是规范,在不同虚拟机里实现是不一样的,最典型的就是永久代(PermGen)和元空间(Metaspace)。实例变量存在堆内存中,和方法区无关。...原创 2020-01-23 17:56:54 · 732 阅读 · 0 评论 -
JVM--Heap堆详解
堆(Heap)一个JVM实例只存在一个堆内存,堆内存的大小是可以调节的。类加载器读取了类文件后,需要把类、方法、常变量放到堆内存中,保存所有引用类型的真是信息,以方便器执行,堆内存分为3部分:Yong Generation Space 新生区: Young/NewTenure Generation Space 养老区:Old/TenurePermanent Space 永久区:Perm...原创 2020-01-23 17:49:33 · 1299 阅读 · 0 评论 -
JVM--Stack栈
栈(Stack)栈也叫栈内存,主管java程序的运行,是在线程创建时创建,它的生命期是跟随线程的生命期,线程结束栈内存也就释放,对于栈来说不存在垃圾回收问题, 只要线程一结束该栈就Over,生命周期和线程一致,是线程私有的。8中基本类型的变量+对象的引用变量+实例方法都是在函数的栈内存中分配。栈存储的内容栈帧中主要保存3类数据:本地变量(Local Variables):输入参数和输出...原创 2020-01-23 15:21:10 · 418 阅读 · 0 评论 -
JVM--本地接口、PC寄存器
本地接口(Native Interface)本地接口的作用是融合不同的编程语言为Java所用,它的初衷是融合C/C++程序,于是就在内存中专门开辟了一块处理标记为native的代码,它的具体做法是Native Method Stack中登记native方法,在Execution Engine执行时加载native libraies。目前该方法使用的越来越少了,除非是与硬件有关的应用,比如通过J...原创 2020-01-23 14:19:48 · 337 阅读 · 0 评论 -
JVM--概述、类加载器
JVM位置JVM是运行再操作系统之上的,它与硬件没有直接的交互。JVM体系结构类加载器ClassLoader负责加载class文件,class文件在文件开头有特定的文件标识(cafe babe),将class文件字节码内容加载到内存中,并将这些内容转换成方法区中的运行时数据结构并且ClassLoader只负责class文件的加载,至于它是否可以运行,则由Execution Engine...原创 2020-01-23 12:49:32 · 259 阅读 · 0 评论