![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
JVM
文章平均质量分 78
我是东山阿
这个作者很懒,什么都没留下…
展开
-
【JVM类加载及字节码技术】类加载阶段——类加载器、双亲委派模式
文章目录类加载器1、启动类加载器2、拓展类加载器3、应用程序类加载器4、双亲委派模式双亲委派的具体过程如下:5、自定义类加载器5.1、使用场景5.2、步骤类加载器Java虚拟机设计团队有意把类加载阶段中的“通过一个类的全限定名来获取描述该类的二进制字节流”这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需的类。实现这个动作的代码被称为“类加载器”(ClassLoader)。对于任意一个类,都必须由加载它的类加载器和这个类本身一起共同确立其在Java虚拟机中的唯一性,每一个类加原创 2022-03-12 20:16:11 · 659 阅读 · 0 评论 -
【JVM类加载及字节码技术】类加载阶段——加载、链接(一)
JVM的类加载——加载、链接【一】原创 2022-03-03 11:19:52 · 445 阅读 · 0 评论 -
【JVM类加载及字节码技术】类加载阶段——初始化(二)
类加载阶段——初始化【二】原创 2022-03-03 11:18:43 · 176 阅读 · 0 评论 -
【JVM类加载及字节码技术】编译期处理-语法糖-枚举类、匿名内部类、方法重写的桥接方法(三)
文章目录九、枚举类1.案例代码:2.编译优化十、匿名内部类案例代码(一):编译优化(一)案例代码(二):编译优化(二)九、枚举类1.案例代码:代码如下:enum SEX { MALE, FEMALE;}2.编译优化代码如下:public final class Sex extends Enum<Sex> { //对应枚举类中的元素 public static final Sex MALE; public static final Sex原创 2021-12-16 15:52:47 · 175 阅读 · 0 评论 -
【JVM类加载及字节码技术】编译期处理-语法糖-可变参、foreach、switch(二)
文章目录四、可变参数1.案例代码2.编译优化五、foreach1.案例代码2.编译优化六、集合使用foreach1.案例代码2.编译优化七、switch字符串1.案例代码2.编译优化七、switch枚举1.案例代码2.编译优化四、可变参数1.案例代码代码如下:public class Demo4 { public static void foo(String... args) { //将args赋值给arr,可以看出String...实际就是String[] St原创 2021-12-16 14:53:40 · 373 阅读 · 0 评论 -
【JVM类加载及字节码技术】编译期处理-语法糖-构造、泛型、拆装箱(一)
文章目录前言一、默认构造函数1.案例代码2.编译优化后二、自动拆装箱1.案例代码2.编译优化后二、泛型集合取值1.案例代码2.字节码文件前言语法糖:其实就是指java编译器把 .java 源文件编译为 .class 字节码的过程,自动生成和转换的代码,主要是为了减轻程序员的负担,算是java编译器给我们的额外福利。注意,以下代码的分析,借助了javap工具,idea的反编译功能,idea插件jclasslib等工具,编译器转换的结果就是class字节码,只是为了便于阅读,给出几乎等价的Jav原创 2021-12-16 09:29:45 · 832 阅读 · 0 评论 -
【JVM类加载及字节码技术】栈中的执行过程-Synchronized(五)
系列文章目录提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加例如:第一章 Python 机器学习入门之pandas的使用提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录系列文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结前言提示:这里可以添加本文要记录的大概内容:例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。提示:以下是本篇文章正文内容,下面案例原创 2021-12-14 21:02:46 · 197 阅读 · 0 评论 -
【JVM类加载及字节码技术】栈中的执行过程-异常处理(四)
文章目录前言一、异常处理?二、try-catch1.案例代码2.对应字节码指令三、多个single-catch1.案例代码2、对应的字节码指令四、finally1.案例代码2、对应的字节码指令四、finally中的return1.案例代码2、对应的字节码指令五、finally中的吞噬异常1.案例代码总结前言本博客讲解的是 JVM中对于异常处理的执行流程。提示:以下是本篇文章正文内容,下面案例可供参考一、异常处理?异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的原创 2021-12-14 20:35:24 · 533 阅读 · 0 评论 -
【JVM类加载及字节码技术】栈中的执行过程-方法调用、多态(三)
文章目录一、方法调用1、JVM底层对不同方法,有不同的实现方式二、多态原理一、方法调用直接分析下面案例代码:public class Demo5 { public Demo5() { } private void test1() { } private final void test2() { } public void test3() { } public static void test4() { } public static void main(String[] args原创 2021-12-14 00:43:06 · 220 阅读 · 0 评论 -
【JVM类加载及字节码技术】栈中的执行过程-构造方法(二)
一、分析案例通过字节码指令来分析代码。public class Demo2 { public static void main(String[] args) { int i=0; int x=0; while(i<10) { x = x++; i++; } System.out.println(x); //结果为0 }}下面我们就通过分析字节码指令:Code: stack=2, locals=3, args_size=1 //操作数栈分配2个空原创 2021-12-14 00:16:18 · 312 阅读 · 0 评论 -
【JVM类加载及字节码技术】栈中的执行过程(一)
文章目录1、类文件结构2、字节码指令**图解上面方法的执行流程**1、方法区载入运行时常量池中的字节码文件2、执行引擎开始执行字节码1. **bipush 10**:2. **istore 1**:3. **ldc #3**:4. **istore 2**:5. **iload1 iload2**:6. **iadd**:7. **istore 3**:8. **getstatic #4**:9. **iload 3**:10. **invokevirtual 5**:11. **return**:1、类原创 2021-12-09 15:43:10 · 1270 阅读 · 0 评论 -
【JVM垃圾回收】GC 调优
调优领域:内存锁竞争CPU占用IOGC确定目标:低延迟/高吞吐量?选择合适的GC并发收集器: CMS G1 ZGC并行收集器: Parallel GCZing七大垃圾收集器:1、串行GC:Serial收集器(1:1)串行收集器是最古老的,最稳定,效率高的收集器,只使用一个线程去回收但其进行垃圾回收过程中可能会产生较长的停顿。虽然在收集垃圾的过程中需要暂停其他的工作线程,但是简单高效,对于单CPU环境来说,没有线程交互的开销可以获得最高的单线程垃圾收集效率。2、并行GC:原创 2021-12-09 08:50:44 · 485 阅读 · 0 评论 -
【JVM垃圾回收】G1垃圾回收器
文章目录G1堆内存结构1、其他算法内存结构,如CMS,serial。2、G1垃圾回收器,内存结构3、RegionGC模式1、Young Collection1.1、Young Collection跨代引用1.2、Remark:重新标记(最终标记)阶段2、Young Collection + CM3、Mixed Collection4、Full GC1、JDK 8u20 字符串去重2、JDK 8u40 并发标记类卸载3、JDK 8u60 回收巨型对象**G1的回收步骤总结**:总结:G1Garbage原创 2021-12-08 21:09:44 · 643 阅读 · 0 评论 -
【JVM垃圾回收】垃圾回收器
垃圾回收器专业词汇解释:并行收集:指多条垃圾收集线程并行工作,但是此时用户线程,仍处于等待线程。并发收集:指用户线程线程个垃圾线程同时工作,不一定是并行的可能会交替执行。用户程序在继续运行,垃圾收集程序在另一个cpu运行。吞吐量:即CPU用于运行用户代码的时间与CPU总消耗时间的比值(吞吐量 = 运行用户代码时间 / ( 运行用户代码时间 + 垃圾收集时间 )),也就是。例如:虚拟机共运行100分钟,垃圾收集器花掉1分钟,那么吞吐量就是99%1、串行单线程内存小,个人电脑cpu安全点:原创 2021-12-08 18:16:44 · 273 阅读 · 1 评论 -
【JVM垃圾回收】分代回收
在内存空间中我们可以大致按照上图划分,将堆空间划分为,新生代,老年代,字符串常量池,封装类常量池。回收机制主要进行在新生代和老年代。新生代:伊甸园:主要用于存放新创建的对象。幸存区From,幸存去To:幸存去To空着,幸存区From存放已经存活有一定次数的对象。老年代:当幸存区From中对象的存活次数达到一定阈值(没有特殊情况就是这样,如果实在是没有空间,那么就会提前放入老年代),就放入老年代。回收流程新创建的对象都被放在了新生代的伊甸园中当伊甸园内存不足时候,就会进..原创 2021-12-08 18:14:24 · 400 阅读 · 0 评论 -
【JVM垃圾回收】垃圾回收算法
1、标记-清除定义:标记清除顾名思义,指虚拟机在进行垃圾回收的过程中,先采用次标记算法确定可回收对象,然后垃圾收集器根据标识,清除相应的内容,给堆内存腾出相应的空间。这里腾出的内存空间并不是将内存空间的字节清0,而是记录下这段内存的起始地址,下次分配内存的时候,直接覆盖这段内存。缺点: 容易产生大量的内存碎片,空间不连续,无法满足大对象的内存分配,一旦导致,无法分配对象,那么就会导致JVM启动GC,我们响应的程序就会陷入stop the world,这就会导致程序响应速度变慢。2、标记-原创 2021-12-08 18:10:34 · 198 阅读 · 0 评论 -
【JVM垃圾回收】如何判断对象可以回收?
1、引用计数算法定义:判断一个对象是否受到引用, 如果受到一个引用就+1,如果减少一个引用就-1,当计数为0那么久标记为垃圾。弊端:循环引用时,两个对象的计数都为1,导致两个对象计数不能为0,不能被定义为垃圾。2、可达性分析算法JVM中的垃圾回收器通过可达性分析来探索所有存活的对象.扫描堆中的对象,看能否沿着GC Root对象为起点的引用链找到该对象,如果找不到,则表示可以回收.可以作为GC Root的对象。【JVM垃圾回收】哪些可以当作GC ROOT?3、五种引用1、强引用(A原创 2021-12-08 18:08:05 · 463 阅读 · 0 评论 -
【JVM垃圾回收】哪些对象可以当作GC ROOT ?
哪些对象可以当作GC ROOT ?一、从虚拟机的内存分区的角度来以下对象可以作为GC Root:局部变量所引用的对象可以作为根对象。 例如 ArratList list = new ArrayList();方法参数所引用的对象也可以作为根对象。如果局部变量不再引用,那么就会被GC垃圾回收。例如:list = null;那么new ArrayList()就会被当作垃圾回收。总结:1.java虚拟机栈中的引用的对象。方法区中的类静态属性引用的对象。 (一般指被static修饰的对象原创 2021-12-08 18:03:47 · 5945 阅读 · 0 评论 -
【JVM内存结构】String在JVM中的深度剖析(四)
案例OK,学习到这里,是不是感觉自己懂了?我出一道题目来考考大家,下面这段程序的运行结果是什么?public static void main(String[] args) { String a =new String(new char[]{'a','b','c'}); String b = a.intern(); System.out.println(a == b); //true String x =new String("def"); St原创 2021-12-08 17:59:02 · 145 阅读 · 0 评论 -
【JVM内存结构】String在JVM中的深度剖析(三)
思考题:1、常量池有多大呢?我想大家一定和我一样好奇,常量池到底能存储多少个常量?前面我们说过,常量池本质上是一个hash表,这个hash表示不可动态扩容的。也就意味着极有可能出现单个 bucket 中的链表很长,导致性能降低。在JDK1.8中,这个hash表的固定Bucket数量是60013个,我们可以通过下面这个参数配置指定数量-Xmx10m 指定堆空间大小可以增加下面这个虚拟机参数,来打印常量池的数据。-xx:StringTableSize=‘桶的个数’,如果常量过多,可以添加这个,减少原创 2021-12-08 17:57:43 · 219 阅读 · 1 评论 -
【JVM内存结构】String在JVM中的深度剖析(二)
1.2、运行时常量池运行时常量池是每一个类或者接口的常量池(Constant Pool)的运行时的表现形式。我们知道,一个类的加载过程,会经过:加载、连接(验证、准备、解析)、初始化的过程,而在类加载这个阶段,需要做以下几件事情:通过一个类的全类限定名获取此类的二进制字节流。在堆内存生成一个 java.lang.Class 对象,代表加载这个类,做为这个类的入口。将class字节流的静态存储结构转化成方法区(元空间)的运行时数据结构。而其中第三点,将class字节流代表的静态储存结构转化为方原创 2021-12-08 17:56:03 · 247 阅读 · 0 评论 -
【JVM内存结构】String在JVM中的深度剖析(一)
面试题:String a = “ab”; String b = “a” + “b”; a == b 是否相等?面试考察点考察目的: 考察对JVM基础知识的理解,涉及到常量池、JVM运行时数据区等。考察范围: 工作2到5年。背景知识要回答这个问题,需要搞明白两个最基本的问题• String a=“ab”,在JVM中发生了什么?• String b=“a”+“b”,底层是如何实现?一、JVM的运行时数据首先,我们一起来复习一下JVM的运行时数据区。为了让大家有一个全局的视角,我从类加载,到原创 2021-12-08 17:51:48 · 286 阅读 · 0 评论