
JVM
文章平均质量分 91
JVM
rockvine
抬头看天,低头走路
展开
-
Java内存区域
文章目录一、简介二、运行时数据区域2.1、虚拟机栈2.1.1、局部变量表2.1.2、操作数据栈2.1.3、动态连接2.1.4、返回地址2.1.5、基于栈的字节码解释执行引擎2.2、程序计数器2.3、本地方法栈2.4、堆2.4.1、栈上分配2.5、方法区2.6、运行时常量池2.7、直接内存一、简介JVM全称Java Virtual Machine,也就是我们耳熟能详的Java虚拟机。它能识别 .class 后缀的文件,并且能够解析其指令,最终调用操作系统,完成我们想要的操作。如上图,一个Java程序,原创 2022-05-04 20:34:42 · 1031 阅读 · 0 评论 -
内存溢出异常
文章目录一、栈溢出二、堆溢出三、运行时常量池溢出四、方法区溢出五、直接内存溢出六、Java异常在JVM的内存区域中介绍了JVM的内存区域,其中除了程序计数器外,虚拟机内存的其他几个运行时区域都有发生OutOfMemoryError异常的可能。一、栈溢出每个Java方法在被调用的时候,都会创建一个栈帧并入栈,那么这里我们直接无限调用递归方法,即可让虚拟机栈溢出。public class StackSOF { private int stackLength = 1; public原创 2022-05-05 14:11:27 · 525 阅读 · 0 评论 -
对象的创建
文章目录一、检查加载二、分配内存2.1、分配方式2.1.1、指针碰撞2.1.2、空闲列表2.2、并发安全2.2.1、CAS 机制2.2.2、分配缓冲三、内存空间初始化四、设置五、对象初始化一个对象的创建在虚拟机中大致分为以下五步:一、检查加载当虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化。如果没有就必须先执行想要的类加载过程。二、分配内存接下来虚拟机将为新生对象分配内存。为对象分配空间的任务原创 2022-05-05 20:48:29 · 806 阅读 · 0 评论 -
对象的内存布局及访问定位
文章目录一、内存布局1.1、对象头1.2、实例数据1.3、对齐填充二、访问定位2.1、句柄2.2、直接指针一、内存布局在HotSpot虚拟机中,对象在内存中存储的布局可以分为 3 块区域:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。1.1、对象头对象头包括两部分信息,第一部分用于存储对象自身的运行时数据,如哈希码(HashCode)、GC 分代年龄、锁状态标志、线程持有的锁、偏向线程 ID、偏向时间戳等。对象头的另外一部分是类型指针,即对象指向它的原创 2022-05-05 21:19:36 · 191 阅读 · 0 评论 -
判断对象的存活及对象的引用
文章目录一、判断对象的存活1.1、引用计数算法1.2、可达性分析算法1.3、finalize方法1.4、方法区回收二、对象的引用2.1、强引用2.2、软引用2.3、弱引用2.4、虚引用一、判断对象的存活在堆里面存放着几乎所有的对象实例,垃圾回收器在对对进行回收前,要做的事情就是确定这些对象中哪些还是“存活”着,哪些已经“死去”(死去代表着不可能再被任何途径使用得对象了)1.1、引用计数算法给对象中添加一个引用计数器,每当有一个地方引用它时,计数器就加1;当引用失效时,计数器值就减1;任何时刻计数器为原创 2022-05-06 16:52:44 · 775 阅读 · 0 评论 -
内存分配策略
文章目录一、栈上分配二、对象优先在Eden区分配三、大对象直接进入老年代四、长期存活的对象将进入老年代五、动态对象年龄判定六、空间分配担保一个对象创建的时候,到底是在堆上分配,还是在栈上分配呢?这和两个方面有关:对象的类型和在 Java 类中存在的位置。Java的对象可以分为基本数据类型和普通对象。对于普通对象来说,JVM会首先在堆上创建对象,然后在其它地方使用的其实是它的引用。比如把这个引用保存在虚拟机栈的局部变量表中。对于基本数据类型来说(byte、short、int、long、float、d原创 2022-05-06 18:56:24 · 1162 阅读 · 0 评论 -
垃圾收集算法
文章目录一、复制算法1.1、Appel式回收二、标记-清除算法三、标记-整理算法当前商业虚拟机的垃圾收集器大多采用“分代收集”算法,根据对象存活周期的不同(1. 绝大部分的对象都是朝生夕死;2. 经过多次垃圾回收的对象就越难回收),一般把Java堆分为新生代和老年代,这样可以通过各个年代的特点采用最适当的收集算法。在新生代中,每次垃圾收集算法都会有大批对象死去,只有极少量存活,一般选用复制算法,字需要付出少量对象的复制成本就可以完成收集。而在老年代因为对象的存活率高,且没有额外空间对它进行分配担保,就原创 2022-05-06 21:35:19 · 176 阅读 · 0 评论 -
垃圾收集器
文章目录一、Serial/Serial Old二、ParNew三、Parallel Scavenge/Parallel Old四、CMS五、G1六、ZGC垃圾收集算法是内存回收的方法论,而垃圾收集器就是内存回收的具体实现。不同分代之间是有着不同的收集器的,如果两个收集器之间存在连线,那就说明他们可以搭配使用。那么是如何在虚拟机中指定它使用上图中搭配的垃圾收集器呢?主要如下:参数说明-XX:+UseSerialGC新生代和老年代都用串行收集器,,即 Serial 和 Serial原创 2022-05-07 00:15:32 · 654 阅读 · 0 评论 -
HotSpot的算法实现
文章目录一、并发标记与三色标记1.1、并发标记过程中漏标问题1.1.1、CMS 解决方案1.1.2、G1 解决方案二、G1的技术细节2.1、跨代引用2.2、RSet(记忆集)2.3、CardTable三、安全点与安全区域3.1、安全点3.2、安全区域一、并发标记与三色标记在三色标记法之前有一个算法叫 Mark-And-Sweep(标记清除)。这个算法会设置一个标志位来记录对象是否被使用。最开始所有的标记位都是 0,如果发现对象是可达的就会置为 1,一步步下去就会呈现一个类似树状的结果。等标记的步骤完成后原创 2022-05-16 12:25:13 · 738 阅读 · 0 评论 -
类文件结构及字节码指令
文章目录一、Class类文件的结构1.1、魔数与Class文件的版本1.2、常量池1.3、访问标志1.4、类索引、父类索引与接口索引集合1.5、字段表集合1.6、方法表集合1.7、属性表集合二、字节码指令2.1、加载和存储指令2.2、运算指令2.3、类型转换指令2.4、对象创建及访问指令2.5、操作数栈管理指令2.6、控制转移指令2.7、方法调用指令2.8、方法返回指令2.9、异常处理指令2.10、同步指令一、Class类文件的结构Class文件时一组以8位字节为基础的二进制流,各个数据项目严格按照顺序原创 2022-05-16 17:58:47 · 278 阅读 · 0 评论 -
类加载的时机及过程
文章目录一、加载二、验证(了解即可)2.1、文件格式验证2.2、元数据验证2.3、字节码验证2.4、符号引用验证三、准备四、解析五、初始化5.1、常见案例类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using) 和 卸载(Unloading) 7个阶段。其中验证、准备、解析3个部分统称为连接(Linking)。加原创 2022-05-17 16:49:37 · 618 阅读 · 1 评论 -
JVM类加载器
文章目录一、类加载器二、类与类加载器三、双亲委派模型四、破坏双亲委派模型4.1、Tomcat4.1.1、WebApp类加载器4.1.2、Shared类加载器4.1.3、Catalina类加载器4.1.4、Common类加载器4.1.5、Jsp类加载器4.2、JDBC一、类加载器从Java虚拟机的角度来讲,只存在两种不同的类加载器:一种是启动类加载器(Bootstrap ClassLoader),这个类加载器使用C++语言实现,是虚拟机自身的一部分;另一种就是所有其他的类加载器,这些类加载器都由Java语原创 2022-05-17 22:12:25 · 3246 阅读 · 0 评论 -
自定义类加载对类进行加密和解密
在JVM类加载器中,我们介绍除了最基础的3种类加载器互相配合进行加载的,我们如果有必要,是加入自己定义的类加载器。这里我们就来自定义一个类加载器,用于实现对类进行加密和解密处理。首先新建一个User.java文件,其中内容具体如下:package com.rockvine.loader;import org.apache.commons.lang3.builder.ToStringBuilder;import org.apache.commons.lang3.builder.ToStringS原创 2022-05-18 11:42:33 · 965 阅读 · 0 评论 -
方法调用的实现
文章目录一、解析1.1、非虚方法1.2、虚方法二、分派2.1、静态分派2.2、动态分派三、Lambda表达式3.1、MethodHandle 方法句柄应用代码经过编译、类加载的各种阶段,进入了JVM的运行时数据区。代码的执行其实本质上是方法的执行,站在JVM的角度归根到底还是字节码的执行。一、解析关于方法的调用,Java 字节码共提供了5个指令,来调用不同类型的方法:invokestatic: 用来调用静态方法invokespecial: 用于调用私有方法、构造器及 super 关键字等in原创 2022-05-18 14:03:43 · 291 阅读 · 0 评论 -
JIT即时编译器
文章目录一、解释器与编译器二、热点代码与热点探测2.1、方法调用计数器2.2、回边计数器三、分层编译四、编译优化4.1、方法内联4.2、标量替换一、解释器与编译器Java程序在运行的时候,主要就是执行字节码指令,一般这些指令会通过解释器(Interpreter)进行解释执行,这种就是解释执行。当虚拟机发现某个方法或代码块的运行特别频繁时,就会把这些代码认定为 热点代码。为了提高热点代码的执行效率,在运行时虚拟机将会把这些代码编译成与本地平台相关的机器码,并进行各种层次的优化,完成这个任务的编译器称为即原创 2022-05-19 17:16:14 · 2138 阅读 · 0 评论 -
虚拟机性能监控与故障处理工具
文章目录一、JDK的命令行工具1.1、jps1.2、jstat1.3、jinfo1.4、jmap 和 jhat1.5、jhat1.6、jstack一、JDK的命令行工具JDK的 bin 目录下为我们提供了很多的工具,如在 Windows安装JDK及Maven 中使用的 java、javac ,以及在 类文件结构及字节码指令 中使用的 javap 等,其实bin目录下还为我们提供了很多的工具,包括了很多用于监视虚拟机性能和故障处理工的工具,如下:这里可以启动如下代码,然后利用介绍的JDK命令行工具查看原创 2022-05-19 12:07:55 · 864 阅读 · 0 评论