
深入理解JVM虚拟机
Frasensy
背负青天而莫之夭阏者
展开
-
虚拟机类加载机制
1、类加载的时机 类从被加载到虚拟机内存开始到卸载出内存为止,整个生命周期:加载、验证、准备、解析、初始化、使用和卸载;其中验证、准备和解析统称为连接 2、类加载的过程 加载 通过类名获取类的二进制字节流 将字节流代表的静态存储结构转化为方法区的运行时数据结构 在Java堆中生成一个代表这个类的java.lang.Class对象,作为方法区数据的访问入口 验证 文件格式验证...原创 2019-01-14 22:10:59 · 152 阅读 · 0 评论 -
类文件的结构
1、语言无关性 虚拟机不关心字节码Class文件的来源是什么语言,只要符合Class文件应有的结构就可以在Java虚拟机上运行 2、Class类文件的结构 是一组以8位字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑地排列在Class文件中 文件格式采用一种伪结构存储,只有两种数据类型:无符号数和表 魔数:文件的头4个字节,用于确定这个文件是否为一个能被虚拟机接受的class文件 常量...原创 2019-01-14 22:10:52 · 153 阅读 · 0 评论 -
垃圾收集器与内存分配策略
1、对象是死是活 引用计数算法 思路:给对象添加一个引用计数器,有一个地方引用就+1,引用失效就-1,当计数器为0时对象就不能再被使用 Java没有选用引用计数算法来管理内存,最主要原因是它很难解决对象之间相互循环引用的问题 根搜索算法 思路:通过一系列名为GC Roots的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何...原创 2019-01-14 22:10:45 · 134 阅读 · 0 评论 -
内存区域和内存溢出异常
1、Java虚拟机管理的内存: 程序计数器 当前线程所执行的字节码的行号指示器 为了多线程中线程切换后能恢复到正确的执行位置,每条线程都需要一个独立的程序计数器 “线程私有”的内存 Java虚拟机栈 线程私有,生命周期和线程相同 每个方法被执行时都会创建一个栈帧Stack Frame用于存储局部变量表、操作栈、动态链接、方法出口等信息 局部变量表存放编译期可知的各种基本数据类型...原创 2019-01-14 22:10:38 · 136 阅读 · 0 评论 -
虚拟机字节码执行引擎
1、运行时栈帧结构 栈帧是用于支持虚拟机进行方法调用和方法执行的数据结构,存储了方法的局部变量表、操作数栈、动态连接、方法返回地址 局部变量表 在Java程序被编译成Class文件时,方法的Code属性的max_locals数据项中确定了该方法所需要分配的最大局部变量表的容量 操作数栈 编译时最大深度在Code属性的max_stacks数据项中确定 2、方法调用:确...原创 2019-01-14 22:10:15 · 99 阅读 · 0 评论 -
早期(编译期)优化
1、Javac编译器 解析:词法分析和语法分析 词法分析是将源代码的字符流转变为标记(Token)集合,单个字符是编写程序过程最小元素,而标记是编译过程最小元素 语法分析是根据Token序列来构造抽象语法树的过程,抽象语法树(AST)是一种用来描述程序代码语法结构的树形表示方式 2、Java语法糖的味道 泛型与类型擦除 Java泛型只在源码存在,编译后的字节码文件被替换成原生类...原创 2019-01-14 22:10:08 · 105 阅读 · 0 评论