
关于JVM的那点儿事儿
文章平均质量分 83
余之孟德
极度自信,严谨细致
展开
-
六、JVM(HotSpot)类文件结构
注:本博文主要是基于JDK1.7会适当加入1.8内容。实现语言无关性的基础是虚拟机和字节码的存储形式。 Java程序(.java)——>javac编译器——–>字节码(.class)—>Java虚拟机(HotSpot) JRuby程序(.rb)——->jrubyc编译器——>字节码(.class)—>Java虚拟机(HotSpot) Groovy程序(...原创 2018-08-14 14:47:12 · 278 阅读 · 0 评论 -
十一、JVM(HotSpot)Java内存模型与线程
注:本博文主要是基于JDK1.7会适当加入1.8内容。1、Java内存模型内存模型:在特定的操作协议下,对特定的内存或高速缓存进行读写访问的抽象过程。不同的物理机拥有不一样的内存模型,而Java虚拟机也拥有自己的内存模型。 主要目标:定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量这样的底层细节。这里的变量与Java编程中所说的变量存在区别,它包括了实例变量、...原创 2018-08-20 16:47:11 · 1245 阅读 · 0 评论 -
十、JVM(HotSpot)晚期(运行时)优化
注:本博文主要是基于JDK1.7会适当加入1.8内容。Java程序最初是通过解释器进行解释执行的,当虚拟机发现某个方法或代码块的运行特别频繁时,就会把这段代码认定为“热点代码”,为了提高这部分代码的执行效率,在运行时,虚拟机会将这些代码编译成与本地平台相关的机器码,并进行各个层次的优化,完成这个任务的编译器成为即时编译器(JIT)。1、HotSpot虚拟机内的即时编译器1)解释器与编译...原创 2018-08-17 17:16:28 · 655 阅读 · 0 评论 -
九、JVM(HotSpot)早期(编译器)优化
注:本博文主要是基于JDK1.7会适当加入1.8内容。1、javac编译器编译过程:解析与填充符号表过程插入式注解处理器的注解处理过程分析与字节码生成过程1)解析与填充符号表 解析步骤:词法分析和语法分析 词法分析:将源代码中的字符流转变为标记(Token)集合,单个字符是程序编写过程的最小元素,而标记则是编译过程的最小元素,关键字、变量名、字面量、运算符都可以成为标记...原创 2018-08-17 16:28:06 · 201 阅读 · 0 评论 -
八、JVM(HotSpot)虚拟机字节码执行引擎
注:本博文主要是基于JDK1.7会适当加入1.8内容。物理机执行引擎:直接建立在处理器、硬件、指令集和操作系统层面。 虚拟机执行引擎:由虚拟机自定义实现,自行制定指令集与引擎体系结构,能够执行不被硬件执行的指令集合。(符号引用—-直接引用)1、运行时栈帧结构定义:用于支持虚拟机进行方法调用和方法执行的数据结构,虚拟机运行时数据区中的虚拟机栈的栈元素。存储了局部变量表、操作数栈、动态链...原创 2018-08-17 16:04:42 · 707 阅读 · 0 评论 -
五、JVM(HotSpot)虚拟机性能监控与故障处理工具
注:本博文主要是基于JDK1.7会适当加入1.8内容。系统问题定位时,知识、经验是关键基础,数据是依据,工具是运用知识处理数据的手段。1、JDK命令行工具(1)jps虚拟机进程状况工具,JVM Process Status Tools,显示指定系统内所有的HotSpot虚拟机进程。类似于Unix/Linux中的ps命令显示指定系统中所有进行的进程。 格式:jps [options] ...原创 2018-08-13 16:39:57 · 258 阅读 · 0 评论 -
四、JVM(HotSpot)垃圾收集器与内存分配策略
注:本博文主要是基于JDK1.7会适当加入1.8内容。1、对象生死判断方法一:引用计数算法(JVM不采用) 对象添加一个引用计数器,当对象被引用则计数器+1,当对象引用失效则计数器-1,任何时刻计数器为0则判断对象不可能再被使用,判定为死亡。JVM(HotSpot)为什么没有使用引用计数器进行判断对象的生死呢?Java对象中存在对象之间的循环引用,如obja.instance = o...原创 2018-08-13 16:02:49 · 493 阅读 · 0 评论 -
三、JVM(HotSpot)Java对象
注:本博文主要是基于JDK1.7会适当加入1.8内容。1、对象创建第一步:虚拟机执行一条new指令时,首先会去检查这个指令的参数是否可以从常量池中获取到符号引用(再次回归到前两章提到的String.intern()用法),并且检查这个符号引用是否已加载、解析和初始化。如果没有,则必须先执行类加载过程。第二步:类加载检查通过后,虚拟机为新对象分配内存。分配内存又分为两种方式:如果虚拟...原创 2018-08-13 13:50:54 · 167 阅读 · 0 评论 -
一、JVM(HotSpot)Java内存区域
注:本博文主要是基于JDK1.7会适当加入1.8内容。切记,分清Java内存区域和Java内存模型是两个概念。Java运行区域大致分为五大部分,分别是:程序计数器、虚拟机栈、本地方法栈,堆,方法区。真实开发环境中,开发人员往往最关注的就是JVM的堆信息和栈信息,而方法区也就是我们通常所说的永久代,JDK1.7后已被移除,加入metaspace区域。1、程序计数器(线程私有)线程技术器是...原创 2018-08-12 15:26:57 · 866 阅读 · 0 评论 -
二、JVM(HotSpot)内存泄漏和内存溢出
注:本博文主要是基于JDK1.7会适当加入1.8内容。1、Java堆溢出//-Xms20m -Xms20m -XX:+HeapDumpOnOutOfMemoryErrorpublic class HeapOOM { static class OOMObject {} public static void main(String[] args) { L...原创 2018-08-12 16:18:53 · 930 阅读 · 0 评论 -
七、JVM(HotSpot)虚拟机类加载机制
注:本博文主要是基于JDK1.7会适当加入1.8内容。虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验,转换解析,初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。1、类加载时机类加载到内存开始直至卸载出内存,它的生命周期包括:加载、验证、准备、解析、初始化、使用和卸载,其中验证、准备、解析称之为连接。加载、验证、准备、初始化、卸载这五个...原创 2018-08-14 15:54:47 · 655 阅读 · 0 评论 -
十二、JVM(HotSpot)线程安全与锁优化----终结篇
注:本博文主要是基于JDK1.7会适当加入1.8内容。线程安全:当多个线程访问一个对象时,如果不用考虑这些线程在运行环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为可以获取正确的结果,那这个对象就是线程安全的。1、Java语言中线程安全不可变(final关键字)绝对线程安全(Vector、HashTable非绝对线程安全,集合里...原创 2018-08-20 17:08:20 · 300 阅读 · 0 评论