自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(18)
  • 收藏
  • 关注

原创 双亲委派机制

JVM 在加载类的过程中,需要使用类加载器进行加载,为此,Java 提供了三层类加载器,以及双亲委派的类加载架构。什么是三层类加载器JVM 在加载类的过程中,需要使用类加载器进行加载,为此,Java 提供了三层类加载器,以及双亲委派的类加载架构。三层加载器分别是 启动类加载器、扩展类加载器、应用程序加载器: 启动类加载器(Bootstrap ClassLoader) 虚拟机的一部分,使用 C++ 实现,加载<JAVA_HOME>/jre/lib 目录中,或者被 -Xb.

2022-01-10 09:00:02 120

原创 类加载的过程

类加载类加载的过程分为 5 个阶段:加载、验证、准备、解析、初始化。图1以如下代码为例,对 Java 类加载的过程进行阐述。package com.zero.demo;public class SuperClassDemo { static { System.out.println("SuperClass Static Block!"); } public static int VALUE = 11; private

2022-01-04 09:58:50 6799

原创 Java方法在栈帧中的执行过程

Java方法的字节码结构以如下代码为例,对 Java 方法的字节码结构进行阐述(jdk 版本 1.8.0_301)。package com.zero.demo;public class MethodAnalyzeDemo { public int doSomething(int i, int j) { int result = i + j; return result; }}通过 javac 命令,可以对 .java 文件进行编译,将

2021-12-27 17:23:35 557

原创 图解 Remembered Set、Card Table、Write Barrier

前情提要,OopMap + Safe Point + Safe Region 有效提高 GC Roots 枚举的效率。然而,仅靠三者的组合,在实际情况中还是存在着缺陷。什么是Remembered Set在分代算法的场景下,线程执行的过程中,对象可能存储在新生代,也可能在老年代。那么,如果对象之间的引用关系,大概率会存在对象跨代引用。举个例子,H引用E、J引用G就是跨代引用,如下图所示:图1在触发 新生代GC 的时候,由于 GC Roots 到 E 和 G 是不可达的,...

2021-12-13 13:44:45 616

原创 图解 OopMap、Safe Point、Safe Region

什么是OopMapGC Roots 枚举的过程中,是需要暂停用户线程的,对栈进行扫描,找到哪些地方存储了对象的引用。然而,栈存储的数据不止是对象的引用,因此对整个栈进行全量扫描,显然是很耗费时间,影响性能的。因此,在 HotSpot 中采取了空间换时间的方法,使用OopMap来存储栈上的对象引用的信息。在GC Roots 枚举时,只需要遍历每个栈桢的 OopMap,通过 OopMap 存储的信息,快捷地找到 GC Roots。OopMap 中存储了两种对象的引用:◉栈里和寄....

2021-12-07 14:02:38 371

原创 漫谈 对象创建的过程

前情提要,Java 创建对象的方式很简单,就是一句简单的newDemo()。然而,我们是否深入思考过,仅仅从 JVM 层面来讨论,这一行代码的背后的底层原理究竟什么呢?JVM 是如何创建对象的?创建对象创建对象的方式有4种:new 关键字、反射机制、Object 类的 clone 方法、反序列化。针对 new 关键字的方式,来谈谈对象创建的过程,例如 Demo 类:// 创建Demo类的实例对象Demo demo = new Demo();// 定义Demo类pub...

2021-11-24 09:38:37 160

原创 简述 即时编译器(JIT)

前情提要,Java 既有解释执行,也有编译执行,为了解决解释器的性能瓶颈问题,优化 Java 的性能,引入了即时编译器,大幅度的提高运行效率。那么,即时编译器又是何方神圣呢,接下来让我们一起去揭开它神秘的面纱!什么是即时编译Java 代码的执行过程中,首先进行前端编译,通过编译器将 .java文件编译成字节码,即 .class文件。然后,进行后端编译,将字节码编译成机器码,在此过程中,有一个编译器将热点代码编译成本地平台相关的机器码,并进行优化。这个编译器就是即时编译器,也称JIT编译器.

2021-11-24 09:23:18 614 1

原创 简述 OutOfMemoryError

在日常开发中,我们多多少少都会遇到OutOfMemoryError(内存溢出)的Error异常,简单来说就是内存不够用了。可是 OutOfMemoryError 具体是怎么一回事?什么原因会导致这个异常的发生?如何加载 OutOfMemoryErrorOutOfMemoryError 在 JVM 启动的时候就已经被加载,可以通过下面这个命令,打印出虚拟机装入的类的信息。java -verbose:class -version图1根据图1的结果,JVM 启动过程中加载了 ...

2021-11-24 09:20:20 310

原创 简述 Stop-The-World 的实现原理

前情提要,Stop-The-World 简称 STW,是指在执行垃圾回收的过程冻结所有用户线程的运行,直到垃圾回收线程执行结束。那么,用户线程是如何阻塞呢?这里将会涉及到一个概念 SafePoint。为什么要 Stop-The-World目前主流的虚拟机采用的都是可达性算法,算法的核心是利用根对象作为起始点,根据对象之间的引用关系,即引用链,通过遍历引用链来判断对象的是否存活。然而,可达性分析算法要求全过程都基于一个能保障一致性的快照中才能够进行分析,简单来说,就是必须全程冻结用户线程的运行

2021-11-24 09:10:54 432

原创 简述 垃圾收集器

前情提要,如果说垃圾回收算法是内存回收的方法论,那么垃圾收集器就是内存回收的实践者。那么,不同的回收算法,有哪些具体的垃圾收集器?适用哪些场景?让我们带着问题,开始发车!有哪些垃圾收集器图1如图1所示,展示了七种作用于不同分代的收集器,如果两个收集器之间存在连线,说明它们可以搭配使用。虚拟机所处的区域,则表示它是属于新生代收集器还是老年代收集器。Serial收集器Serial收集器 是最基本的收集器,属于新生代收集器,单线程执行垃圾回收,必须全程冻结用户线程的运行。..

2021-11-24 09:06:12 226

原创 漫谈 观察者模式

什么是观察者模式观察者模式(Observer Pattern):定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。观察者模式又叫做: 发布-订阅(Publish/Subscribe)模式 模型-视图(Model/View)模式 源-监听器(Source/Listener)模式 从属者(Dependents)模式 观察者模式是一种对象行为型模式。策略模式的结构:◉ Subject:被观察者◉ Co

2021-11-23 17:50:45 84

原创 漫谈 策略模式

什么是策略模式策略模式(Strategy Pattern):定义一系列算法,将每一个算法封装起来,并让它们可以相互替换,是一种对象行为型模式。策略模式的结构:◉Context: 环境类◉Strategy: 抽象策略类◉ ConcreteStrategy: 具体策略类例如,双十一购物节有各种优惠活动,有满减的、打折的、预售的等等,这些优惠方式其实都是一种算法,算法本身就是一种具体的策略。其中,购物节本身就是环境类,所有的优惠方式都是抽象为抽象策略类,每一种优惠方式就是具体...

2021-11-23 17:45:54 214

原创 并发的可达性分析

前情提要,当前主流编程语言的垃圾收集器,基本上都是依靠 可达性分析算法 来判定对象是否存活。然而,可达性分析算法要求全过程都基于一个能保障一致性的快照中才能够进行分析,简单来说,就是必须全程冻结用户线程的运行,这样很影响运行效率。为了减少用户线程冻结的影响,提高运行效率,在这里我们引入一个概念:并发标记。接下来,让我们一起去了解并发标记是什么。并发标记的作用首先提出一个问题,为什么全程冻结用户线程的运行,很影响运行效率?根据可达性分析算法 的核心概念,利用系列根对象(GC Roots .

2021-11-23 17:39:56 347

原创 JVM 如何标记垃圾对象 之 可达性算法

前情提要,当内存空间不足的时候,JVM 就会触发垃圾回收机制,对垃圾对象进行回收,清理出足够的内存空间,存放新的对象。那么,JVM 是怎么识别垃圾对象的?判断的标准是什么?接下来,让我们一起带着问题,去寻找答案吧!引用计数法何为垃圾?没用的、不需要的东西就是垃圾。在代码的世界也是如此,当对象不被引用的时候,我们就可以认为,这就是一个垃圾对象。那么,有什么办法可以识别哪些对象不被引用呢?最简单办法,就是对实例对象被引用的次数做一个记录,具体实现方式就是在对象头中增加了一个计数器属性..

2021-09-19 21:55:19 221

原创 简述 垃圾回收算法(下)

前情提要,上一篇文章我们知道了标记-清除算法,以及优化了碎片空间的问题而衍生的 标记-复制算法 和 标记-压缩算法。然而,这两种算法的优缺点都比较极端,因此在实际应用中很少应用到。在文章的最后,提到了一种算法:分代算法,它能够比较好的平衡这两者的优缺点,将效率提升一个层次。那么,它到底是何方神圣,下面将带大家揭开它的庐山真面目,废话少说,开始发车!什么是分代算法首先,我们需要了解分代算法的空间结构,分代算法沿袭了标记-复制算法的分区的特色,将内存空间分为两个区域:新生代和老年代...

2021-09-15 10:24:38 85

原创 简述 垃圾回收算法(上)

前情提要,我们知道内存空间是有限的,对象存放在内存中,随着对象不断的增加,内存空间总会有占满的一天。这时候,就需要对内存空间进行管理,将已经没用的对象进行回收,清理出足够的空间存放新的对象。那么,JVM 对于垃圾对象是怎么回收呢?本文将简述几种垃圾回收算法,废话少说,开始发车!标记-清除算法这是最基础的,也是最容易实现垃圾回收算法,它分为两个步骤:标记和清除。 标记:标记出需要被回收的对象 清除:将被标记的对象进行回收。 下面用一张图演示整个垃圾回..

2021-09-15 10:08:36 113

原创 对象实体为什么存放在堆

前情提要,在 JVM 中,对象实体存储在堆,对象引用是存储在栈。为什么这样存放呢?这背后的缘由是什么?接下来我将通过存放和使用两个角度来讲述这个问题。废话少说,立刻发车。什么是堆栈针对这个问题,我们首先要了解,堆、栈的数据结构。堆的数据结构是一个特殊线性表,存取数据的原则是先进后出,最先放入的总是最后拿出来。就像我们将书本存放到箱子,最先放入的书本总是被压在最底下,最后放入的书本总是在最顶层。栈的数据结构通常是一个完全二叉树,每一个节点存储一个值,整棵树都是经过排序的。在...

2021-09-07 15:47:42 765 1

原创 如何优雅的理解单例模式

什么单例模式 ?单例模式,也称单子模式,属于一种创建型模式。在这种模式下,保证一个类只能有一个实例对象,而且该类负责创建唯一的实例对象。设计原则:构造方法私有化、静态方法返回对象、对象只进行一次实例化例如有一个SingleObject类,demo1和demo1的引用是完全相同的。public class SingleObject {​ // 构造函数私有化 private SingleObject() {} // 对象只进行一次实例化 priv...

2021-09-06 11:48:44 90

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除