
JVM笔记-深入理解JAVA虚拟机
文章平均质量分 86
主要是 深入理解JAVA虚拟机-周志明 一书的笔记
QuantumBroken
这个作者很懒,什么都没留下…
展开
-
JVM笔记6 锁的实现
线程安全线程安全是什么当多个线程同时访问一个对象时,如果不用考虑这些线程在运行时环境下 的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对 象的行为都可以获得正确的结果,那就称这个对象是线程安全的。摘自《Java并发编程实战(Java Concurrency In Practice)》线程安全的级别不可变、绝对线程安全、相对线程安全、线程兼容和线程对立。不可变final关键字修饰基本类型,就可以保证它的不可变性。而final修饰的类,表示的是类不可被继承原创 2021-07-27 21:04:32 · 142 阅读 · 0 评论 -
并发编程4 synchronized实现原理
语法特性原理字节码 - Class文件synchronized关键字经过Javac编译之后, 会在同步块的前后分别形成monitorenter和monitorexit这两个字节码指令。 这两个字节码指令都需要一个reference类型的参数来指明要锁定和解锁的对象。如果Java源码中的synchronized明确指定了对象参数, 那就以这个对象的引用作为reference; 如果没有明确指定, 那将根据synchronized修饰的方法类型(如实例方法或类方法) , 来决定是取代码所在的对象实例还是原创 2021-04-16 10:49:26 · 76 阅读 · 0 评论 -
JVM笔记9 Java内存模型与volatile
硬件效率与一致性缓存一致性CPU速度和内存速度间有数量级的差异[1],因此在CPU和内存间需要有高速缓存,但是会带来缓存一致性的问题。[1] intel cpu 4 GHz,DDR 3200内存,但是内存芯片速率仅为400 MHz,时钟速度之比为10:1,当处理器需要处于内部高速缓存之外的数据项时,每个周期必须等待10个时钟周期才能使内存芯片完成数据的提取和发送。乱序执行为了使处理器内部的运算单元能尽量被充分利用, 处理器可能会对输入代码进行乱序执行(Out-Of-Order Execution原创 2021-04-15 00:18:38 · 104 阅读 · 0 评论 -
JVM笔记8 线程的实现
运行的JVM本身是个进程,在JVM进程中有许多线程。线程的引入, 可以把一个进程的资源分配和执行调度分开, 各个线程既可以共享进程资源(内存地址、 文件I/O等) , 又可以独立调度。目前线程是Java里面进行处理器资源调度的最基本单位。主流的操作系统都提供了线程实现, Java语言则提供了在不同硬件和操作系统平台下对线程操作的统一处理, 每个已经调用过start()方法且还未结束的java.lang.Thread类的实例就代表着一个线程。实现线程主要有三种方式: 使用内核线程实现(1: 1实现)原创 2021-04-15 00:51:31 · 163 阅读 · 0 评论 -
JVM笔记7 后端编译
后端编译如果我们把字节码看作是程序语言的一种中间表示形式(Intermediate Representation, IR) 的话,前后是相对于字节码文件说的。提前编译(Ahead Of Time, AOT)即时编译(Just In Time,JIT)hotspot为何HotSpot虚拟机要使用解释器与即时编译器并存的架构?为何HotSpot虚拟机要实现两个(或三个) 不同的即时编译器?程序何时使用解释器执行? 何时使用编译器执行?哪些程序代码会被编译为本地代码? 如何编译本地代码?如原创 2021-07-26 21:28:43 · 176 阅读 · 0 评论 -
JVM笔记6 前端编译
前端编译的过程javac编译器由java语言写成过程准备过程: 初始化插入式注解处理器解析与填充符号表过程词法、 语法分析。 将源代码的字符流转变为标记集合, 构造出抽象语法树填充符号表。 产生符号地址和符号信息插入式注解处理器的注解处理过程: 插入式注解处理器的执行阶段分析与字节码生成过程标注检查。 对语法的静态信息进行检查数据流及控制流分析。 对程序动态运行过程进行检查。解语法糖。 将简化代码编写的语法糖还原为原有的形式。字节码生成。 将前面各个步骤所生成的信息转化成原创 2021-07-26 21:28:58 · 84 阅读 · 0 评论 -
JVM笔记6 虚拟机字节码执行引擎
运行时栈帧结构Java虚拟机以方法作为最基本的执行单元, “栈帧”(Stack Frame) 则是用于支持虚拟机进行方法调用和方法执行背后的数据结构, 它也是虚拟机运行时数据区中的虚拟机栈(Virtual Machine Stack) [1]的栈元素。 栈帧存储了方法的局部变量表、 操作数栈、 动态连接和方法返回地址等信息。从Class文件格式的方法表中找到以上大多数概念的静态对照物。 每一个方法从调用开始至执行结束的过程, 都对应着一个栈帧在虚拟机栈里面从入栈到出栈的过程。局部变量表局部变量表(L原创 2021-07-27 20:54:24 · 144 阅读 · 0 评论 -
JVM笔记5 字节码指令
简介Java虚拟机采用面向操作数栈而不是面向寄存器的架构Java虚拟机的指令由操作码+操作数组成操作码为一个字节,0-255,指令不能超过256条,目前已有200多条,能合并就合并class文件放弃了操作数的长度对齐,虚拟机在处理那些超过一个字节的数据时, 需要在运行时从字节中重建出具体数据的结构。将一个16位长度的无符号整数使用两个无符号字节存储起来(假设将它们命名为byte1和byte2), 需要进行:(byte1 << 8) | byte2优势是可以可以省略掉大量的原创 2021-07-26 21:29:23 · 103 阅读 · 0 评论 -
JVM笔记4 垃圾收集器
概述上一篇介绍了Java内存运行时区域分为程序计数器、 虚拟机栈、 本地方法栈、Java堆和方法区。哪些内存需要垃圾收集器呢?程序计数器、 虚拟机栈、 本地方法栈3个区域随线程而生, 随线程而灭, 栈中的栈帧随着方法的进入和退出而有条不紊地执行着出栈和入栈操作。 每一个栈帧中分配多少内存基本上是在类结构确定下来时就已知的(尽管在运行期会由即时编译器进行一些优化, 但在基于概念模型的讨论里, 大体上可以认为是编译期可知的) , 因此这几个区域的内存分配和回收都具备确定性,在这几个区域内就不需要过多考虑如何原创 2021-04-14 17:55:45 · 96 阅读 · 0 评论 -
JVM笔记3 虚拟机执行子系统-类加载
java类的生命周期类加载过程加载 : .class文件 ->方法区运行时数据结构 -> 生成java.lang.Class对象连接验证准备:为静态变量分配内存并设初值,JDK 8及之后, 类变量则会随着Class对象一起存放在Java堆中解析:将常量池中的符号引用替换为直接引用初始化:执行()方法和()方法()方法:前端编译器将源文件中的静态变量赋值语句,静态代码块自动生成()方法JVM保证父类的()方法一定在子类()方法前执行类的初始化时机比如执行某原创 2021-04-14 23:05:29 · 93 阅读 · 0 评论 -
JVM笔记2 JVM内存结构 即 java运行时数据区
简介逻辑结构PC程序计数器什么是程序计数器程序计数器(Program Counter Register):也叫PC寄存器,是一块较小的内存空间,它可以看做是当前线程所执行的字节码的行号指示器。在虚拟机的概念模型里,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令、分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。PC寄存器的特点区别于计算机硬件的pc寄存器,两者不略有不同。计算机用pc寄存器来存放“伪指令”或地址,而相对于虚拟机,pc寄存原创 2021-04-13 17:03:00 · 144 阅读 · 0 评论 -
JVM笔记1 类文件结构
编译与执行类文件结构Class文件是一组以8个字节为基础单位的二进制流, 各个数据项目严格按照顺序紧凑地排列在文件之中, 中间没有添加任何分隔符, 这使得整个Class文件中存储的内容几乎全部是程序运行的必要数据, 没有空隙存在。 当遇到需要占用8个字节以上空间的数据项时, 则会按照高位在前的方式分割成若干个8个字节进行存储。根据《Java虚拟机规范》 的规定, Class文件格式采用一种类似于C语言结构体的伪结构来存储数据, 这种伪结构中只有两种数据类型: “无符号数”和“表”。 后面的解析都要原创 2021-07-26 21:30:05 · 73 阅读 · 0 评论 -
JVM笔记0 综述
java语言java语言是一种高级编程语言,遵循java语言规范语言发展历程经历了机器语言:0101,汇编语言:机器语言的助记符号低级语言:脱离了机器码的束缚高级语言:的阶段java语言是一种混合执行的语言,编译期:将.java编译成.class文件,执行期:.class文件,可以解释执行,也可以编译执行,更常见的则是解释和编译公共进行jdk,jre,jvm的区别jdk:Java Development Kit java开发者套件,=jre+工具包,如javac,java,jar等工具原创 2021-04-15 00:20:13 · 87 阅读 · 0 评论