0.前言 从这篇随笔开始记录Java虚拟机的内容,以前只是对Java的应用,聚焦的是业务,了解的只是语言层面,现在想深入学习一下. 对JVM的学习肯定不是看一遍书就能掌握的,在今后的学习和实践中如果有领会到的心得和踩过的坑,将会对这些文章进行更新. 另外,人脑更喜欢图胜过文字,有些流程先用文字码在那儿,后面有时间再画图. 1.「深入理解Java虚拟机」学习笔记(1) - Java语言发展趋势 2.「深入理解Java虚拟机」学习笔记(2)- JVM内存区域 3.[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方法执行的内存模型:每个方法在执行的时候都会创建一个栈帧,用来存储变量表.操作数…
正文 一.无关性的基石 1.两种无关性 平台无关性: Java 程序的运行不受计算机平台的限制,"一次编写,到处运行". 语言无关性: Java 虚拟机只与 Class 文件关联,并不关心 Class 文件的来源是何种语言. 2.无关性的实现基础 各种不同平台的虚拟机 所有平台都统一使用的字节码存储格式 二.Class 类文件的结构 Class 类文件是一组以 8 字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑地排列在 Class 文件中,中间没有添加任何分隔符.当遇到需要占用…
设正整数$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)实现了热点代码检测和运行时编译及优…
<深入理解 Java 虚拟机>学习笔记 -- 内存区域 运行时数据区域 主要分为 6 部分: 程序计数器 虚拟机栈 本地方法栈 Java 堆 方法区 如图所示: 1. 程序计数器(线程私有) 程序计数器是当前线程所执行字节码的行号指示器 字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令 为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器 执行 Java 方法,计数器记录的是正在执行的虚拟机字节码指令的地址:执行的是 Native 方法,计数器…