![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
JVM学习
文章平均质量分 80
wen-pan
是程序猿一只呀
展开
-
JVM空间分配担保流程
JVM空间分配担保流程在进行Minor GC之前,JVM首先会检查【老年代最大连续空闲空间】是否大于【当前新生代所有对象占用的总空间】如果是,那么说明此次的Minor GC是安全的,可以放心的进行Minor GC如果不是,则JVM会去查看HandlePromotionFailure参数的值是否为true(表示是否允许担保失败)如果不允许担保失败,则此时就会进行一次Full GC 以腾出老年代更多的空间如果允许担保失败,则此时JVM会去检查【老年代最大连续空闲空间】是否大于【历次晋升到老年代的对原创 2022-03-07 11:57:03 · 2481 阅读 · 1 评论 -
NIO中如何使用虚引用管理堆外内存原理
虚引用是最弱的引用,弱到什么地步呢?也就是你定义了虚引用根本无法通过虚引用获取到这个对象,更别谈影响这个对象的生命周期了。在虚引用中唯一的作用就是用队列接收对象即将死亡的通知。1、虚引用的特点虚引用必须与ReferenceQueue一起使用,当GC准备回收一个对象,如果发现它还有虚引用,就会在回收之前,把这个虚引用加入到与之关联的ReferenceQueue中。无法通过虚引用来获取被虚引用对象引用的真实对象!!!!ReferenceQueue queue = new ReferenceQue原创 2021-11-11 11:37:34 · 1763 阅读 · 1 评论 -
从字节码理解++i和i++的区别
1、结论i++是先将数字加载到操作数栈进行其他运算,然后再将局部变量槽中的变量值加一++i是先在局部变量槽中将该变量的值加一,然后再将这个局部变量槽中的值加载到操作数栈进行其他运算。2、简单的示例代码public static void main(String[] args) { int i = 0; int j = i++; int k = ++i; System.out.println("j = " + j + ", k = " + k);}3、对应的字原创 2021-10-27 14:11:30 · 346 阅读 · 0 评论 -
JVM逃逸分析
一、JVM的运行模式1、解释模式(Interpreted Mode)只使用解释器(-Xint 强制JVM使用解释模式),执行一行JVM字节码就编译一行为机器码 编译模式(Compiled Mode)2、只使用编译器(-Xcomp JVM使用编译模式)先将所有JVM字节码一次编译为机器码,然 后一次性执行所有机器码3、混合模式(Mixed Mode)解释模式和只使用编译器的模式都有明显的缺陷,哪能不能将两种模式整合一下呢?这就是混合模式(JVM默认使用)。依然使用解释模式执行代码,但是原创 2021-10-25 15:13:13 · 880 阅读 · 0 评论 -
CMS垃圾收集器
①、CMS简介CMS设计的初衷是为了提升应用程序的响应时间,也就是降低垃圾回收的时候STW的时间。所以CMS采用了并发标记和并发清除,让垃圾收集线程和用户线程并发运行,从而实现提升程序响应时间,减少STW的目的。CMS是什么:CMS全称叫Concurrent Mark Sweep从名字就能看出来这是一个并发收集并且采用标记-清除算法的垃圾收集器。一种以获取最短回收停顿时间为目标的老年代收集器注意:标记是指将存活的对象和要回收的对象都给标记出来,而清除是指清除掉将要回收的对象。应用场景原创 2021-10-25 10:41:29 · 582 阅读 · 0 评论 -
使用SPI机制加载MySQL驱动源码分析
一、SPI介绍SPI具体介绍,可以参考以前的文章:https://blog.csdn.net/Hellowenpan/article/details/101112365?spm=1001.2014.3001.5501二、为什么要使用SPI机制加载driver主要原因是为了实现解耦和可插拔JDK提供数据库驱动的规范(即Driver接口)但不提供任何的实现,位于java.sql包下各个不同的数据库厂商按照JDK提供的规范去进行不同的实现(比如MySQL驱动实现,Oracle数据库驱动实现)JVM原创 2021-10-23 22:49:17 · 1181 阅读 · 0 评论 -
聊聊JVM软引用和弱引用
一、说明由于软引用和弱引用工作流程相同,所以这里只介绍软引用!软引用和弱引用最大的不同点:软引用:发生了垃圾回收,并且回收后内存仍然不足,并且【被软引用指向的对象】没有强引用,那么【被软引用指向的对象】就会被回收。弱引用:只要发生了垃圾回收,并且【被弱引用对象引用的对象】没有被其他【被弱引用对象引用的对象】就会被GC回收JVM中有四种引用,分别是强、软、弱、虚,千万不要将软弱虚这三种引用理解为栈上的变量指向堆上的对象的指针。软引用、弱引用、虚引用:这三种引用其实就是一个个的类,通原创 2021-10-15 18:06:31 · 402 阅读 · 0 评论 -
java为什么不推荐覆写Object的finalize方法
说明:在JVM中除了强、软、弱、虚这四种引用以外,其实还有一种类型的引用,这种引用非常不常见,在日常开发中基本99.9999999999%不会用,在JVM回收覆写了finalize方法的对象时会用到这种引用。这种引用就是【终结器引用】。java提供了一个finalize方法,可以帮助我们进行资源释放,类似于C++中的析构函数。但是目前普遍的认识是不要使用,为什么呢?就是因为对java虚拟机的垃圾回收有影响。1、为什么不推荐使用覆写Object的finalize方法Object类的finalize原创 2021-10-15 11:01:48 · 694 阅读 · 0 评论 -
JVM常量池和运行时常量池
一、类的二进制字节码包含哪些信息要理解常量池是什么,先看看类的二进制字节码包含哪些信息!!!常量池类的基本信息(比如:类的访问权限、类的名称、实现了哪些接口)类的方法定义(包含了虚拟机指令,也就是把我们代码编译为了虚拟机指令 )二、通过反编译字节码验证1、测试代码将下面的测试代码使用javac 编译为 *.class文件public class HelloWorld { public static void main(String[] args) { System原创 2021-10-12 16:46:30 · 6657 阅读 · 0 评论 -
JVM方法区到底是什么
以前每次学习JVM都有涉及到对方法区的学习,看网上一些文章或视频介绍对于方法区的描述五花八门,很多都说的模棱两可,理解的很不准确,学习完不久后就忘记了。所以决定从权威的官方介绍来理解方法区到底是什么。一、方法区定义从JVM官方对方法区介绍原文来准确的理解方法区是什么!!!英文原版链接:https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-2.html#jvms-2.5.4The Java Virtual Machine has a meth原创 2021-10-12 14:59:51 · 326 阅读 · 0 评论 -
Java自定义类加载器
记录一个自定义的类加载器,并且使用自定义的类加载器来加载类。自定义类加载器步骤1、继承ClassLoader类2、自定义获取.class文件数据的方式(一般使用文件流的方式来获取.class文件)3、然后重写ClassLoader类的findClass方法4、在findClass方法中,将获取到的字节数组数据以及要加载的类的全限定名传入ClassLoader类的defineClass...原创 2019-10-13 10:39:19 · 392 阅读 · 0 评论 -
JVM中Class文件常量池中存放了哪些信息
目录直接引用和符号引用简述:Class常量池局部变量的讨论拓展知识直接引用和符号引用简述:举个例子:现在我要在A类中引用到B类,符号引用就是我只要知道B类的全类名是什么就可以了,而不用知道B类在内存中的那个具体位置(有可能B类还没有被加载进内存呢)。直接引用就相当于是一个指针,能够直接或者间接的定位到内存中的B类的具体位置。将符号引用转换为直接引用简单来说就是:在A类中可以...原创 2019-09-26 13:24:36 · 4850 阅读 · 1 评论 -
源码分析JDBC加载数据库驱动
通过源码分析JDBC加载数据库驱动本文是对类加载器学习总结!!!一、问题引入1、我们平时如果在项目中需要使用到数据库(以MySQL数据库为例)首先我们需要将MySQL数据库的驱动放在class path下2、在需要使用数据库的地方使用 Class.forName(“com.mysql.jdbc.Driver”);来加载数据库驱动3、使用DriverManager.getConnectio...原创 2019-09-21 22:31:26 · 861 阅读 · 0 评论 -
详解ServiceLoader如何将class path下服务实现类加载到jvm
ServiceLoader源码分析和SPI总结????:最近两天通过阅读了一些源码和java doc对JVM有了粗浅的认识,特此做个知识记录!????介绍这个问题之前一定要对SPI知识有所了解!SPI介绍0. 问题引入1、拿我们的JDBC来引入问题,我们在自己的应用程序中如果要使用到数据库,我们只需要将该数据库的驱动jar包引入到应用的classpath下,然后在项目中使用Class.forNam...原创 2019-09-21 20:54:02 · 2531 阅读 · 0 评论