0.前言 从这篇随笔开始记录Java虚拟机的内容,以前只是对Java的应用,聚焦的是业务,了解的只是语言层面,现在想深入学习一下. 对JVM的学习肯定不是看一遍书就能掌握的,在今后的学习和实践中如果有领会到的心得和踩过的坑,将会对这些文章进行更新. 另外,人脑更喜欢图胜过文字,有些流程先用文字码在那儿,后面有时间再画图. 1.「深入理解Java虚拟机」学习笔记(1) - Java语言发展趋势 2.「深入理解Java虚拟机」学习笔记(2)- JVM内存区域 3.[Java]「深入理解Java虚拟机…
之前在学习ASM时做了一篇笔记<Java字节码操纵框架ASM小试>,笔记里对类文件结构做了简介,这里我们来回顾一下. Class类文件结构 在Java发展之初设计者们发布规范文档时就刻意把Java的规范拆分成了Java语言规范和Java虚拟机规范.而Java可以跨平台主要是靠不同平台的虚拟机来实现的,而在不同平台的虚拟机使用了统一的程序储存格式——字节码(ByteCode)即Class文件. 由于字节码格式(Class文件)是统一的,所以在Java语言之外发展出了一大批在Java虚拟机上运行的…
Java虚拟机类加载过程是把Class类文件加载到内存,并对Class文件中的数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的java类型的过程. 在加载阶段,java虚拟机需要完成以下3件事: a.通过一个类的全限定名来获取定义此类的二进制字节流. b.将定义类的二进制字节流所代表的静态存储结构转换为方法区的运行时数据结构. c.在java堆中生成一个代表该类的java.lang.Class对象,作为方法区数据的访问入口. Java虚拟机的类加载是通过类加载器实现的, Java中…
C/C++在编译时需要进行连接,而Java的类加载.连接和初始化是在运行时完成的. 图  类的生命周期 图中解析的过程不一定在准备和初始化之间,也可以在初始化之后再开始,以支持Java的运行时动态绑定. 一.类加载过程 1.加载 加载是整个“类加载”过程的第一个阶段.这一步也叫“加载”,可以理解为把类从文件中读取到内存中并按一定数据结构保存以备后续使用. 主要分为三个步骤: ①通过类的全限定名获取其字节码. ②将字节码中的静态存储结构转换成方法区的运行时数据结构. ③在内存中创建一个代表这个类的…
我为什么喜欢Java,另一个重要原因就是跨平台,WORA. 程序员是爽了,但肯定有人要为你遮风挡雨,解决WORA的基石就是字节码+虚拟机. ♣Tip 其实这里存在两种无关性,一是平台无关性.另一个是语言无关性.通过向不同的硬件平台和操作系统提供 不同的JVM实现上层应用和底层平台之间的解耦:另一个,JVM生态系统中有多种语言如Scala.Groovy和Jruby, 它们通过编译生成统一的字节码来实现互操作,达到了语言无关性的目的,这样各个语言可以在各自擅长的领域发挥作用. 概括了一下字节码文件的…
一.运行时数据区 JVM在执行Java程序的时候,将其运行时数据区划分为若干不同区域.它们的用途和创建及销毁的时间不同. 1.程序计数器(Program Counter Register) 是一块很小的内存空间.当线程执行的是Java方法,它记录的是当前正在执行的字节码指令的地址:当线程执行的是Native方法,则它的值为空. 2.虚拟机栈(Java Virtual Machine Stacks) 它描述的是Java方法执行的内存模型:每个方法在执行的时候都会创建一个栈帧,用来存储变量表.操作数…
设正整数$m_1, m_2, ... , m_r$两两互素,对于同余方程组 $x ≡ a_1 \ (mod \ m_1)$ $x ≡ a_2 \ (mod \ m_2)$ $...$ $x ≡ a_r \ (mod \ m_r)$ 有整数解.设$P = \prod\limits_{k = 1}^{r} m_k$,则有 $$x ≡ a_1 M_1 M_1^{-1} + a_2 M_2 M_2^{-1} + ... + a_r M_r M_r^{-1}\ ( \ mod \ P)$$ 其中,$M_i…
Java四种引用--<深入理解Java虚拟机>学习笔记及个人理解(四) 书上P65. StrongReference(强引用) 类似Object obj = new Object() 这类的引用 就是强引用. SoftReference(软引用) 用来描述一些有用但并非必需的对象. 在系统将要发生内存溢出异常前, 将会把这些对象列进回收范围之中, 进行二次回收.(如果这次回收了之后, 内存还是不足, 那么就会抛出内存溢出异常) 执行下面这段代码的时候, 设置一下虚拟机参数-Xms2m -Xmx…
Java虚拟机内存溢出异常--<深入理解Java虚拟机>学习笔记及个人理解(三) 书上P39 1. 堆内存溢出 不断地创建对象, 而且保证创建的这些对象不会被回收即可(让GC Root可达). /** * 堆内存溢出demo * VM Options: -Xms6m -Xmx6m */ public class HeapOOM { static class OOMObejct { } public static void main(String[] args) { List<OOMObe…
<深入理解Java虚拟机>学习笔记 一.走近Java JDK(Java Development Kit):包含Java程序设计语言,Java虚拟机,JavaAPI,是用于支持 Java 程序开发的最小环境. JRE(Java Runtime Environment):包含Java SE API 子集,Java 虚拟机,是支持Java程序运行的标准环境. Java的优点: (1)提供了相对安全的内存管理和访问机制,避免了绝大部分的内存泄露和指针越界问题. (2)实现了热点代码检测和运行时编译及优…