Java
文章平均质量分 70
Lud_
积累点滴
展开
-
HashMap 源码细节解析
文章目录new HashMap<>(); 初始化过程首次 hashMap.put("key", "value"); 创建空间过程非首次调用 hashMap.put("key", "value"); 插入值和扩容的逻辑分析 get 流程:hashMap.get("key");分析 remove 流程:hashMap.remove("key");往红黑树中插入值将链表转换为红黑树:treeifyBin(tab, hash);从红黑树中读取操作HashMap 常被问到的问题分析JDK版本:15.0.原创 2021-12-19 19:16:18 · 440 阅读 · 0 评论 -
Java虚拟机-双亲委派机制
文章目录双亲委派机制概述双亲委派机制原理双亲委派机制的优势沙箱安全机制双亲委派机制概述Java虚拟机对class文件采用按需加载的方式,也就是说当需要使用该类时,才会将它的class文件加载到内存生成class对象。而且加载某个类的文件是,采用的是双亲委派机制,即把请求交由父类处理,它是一种任务委派模式。先看下面的一个例子新建一个 java.lang 包,在下面自定义一个String类 ,如图然后在Test中创建String类public class Test { public s原创 2021-07-15 00:31:39 · 266 阅读 · 1 评论 -
Java虚拟机-类加载器
文章目录类和类加载器类加载器的分类启动类加载器 Bootstrap ClassLoader扩展类加载器 Extension ClassLoader应用程序类加载器 (系统类加载器 AppClassLoader)用户自定义类加载器关于 ClassLoader类和类加载器类加载器虽然只用于实现类的加载动作,但它在Java程序中起到的作用却远超类加载阶段。对于任意一个类,都必须由加载它的类加载器和这个类的本身一起确定其在Java虚拟机的唯一性。每一个类加载器,都有一个独立的命名空间。这句话可以表达的更通俗一原创 2021-07-14 00:42:48 · 117 阅读 · 0 评论 -
Java虚拟机-类加载器以及类的加载过程
文章目录类加载器子系统的作用类加载器 ClassLoader类加载的过程概述加载验证准备解析初始化类加载器子系统的作用类加载器子系统负责从文件系统或者网络中加载class文件,class文件在文件开头有特定的标识。ClassLoader只负责class文件的加载,至于它是否可以运行,由Execution Engine决定加载类信息存放在方法区的内存空间中。除了类信息外,方法区中还会存放运行时常量池信息,可能还包括字符串字面量和数字常量(Class文件中常量池部分的内存映射)。类加载器 Cla原创 2021-07-08 20:40:43 · 243 阅读 · 2 评论 -
Java虚拟机-分代收集算法、增量收集算法、分区算法
文章目录分代收集算法增量收集算分区算法分代收集算法没有最优的算法,只有更合适的算法,不同的算法在不同的情况会有不同的效果 所以JVM提出了分代收集算法,它并不是一种算法,而是根据不同时期采用不同的算法。因为前面提到的几种算法,没有一种算法可以完全替代另外一种算法,他们都有各自的优点。分代收集算法:是基于这样的一个事实:不同的对象的生命周期时不一样的。因此不同生命周期的对象可以采用不同的垃圾回收算法,以便提高垃圾回收效率。一般是把Java堆分成新生代和老年代,这样就可以根据各个代的特点,使用不同的原创 2021-07-02 00:26:46 · 245 阅读 · 1 评论 -
Java对象的finalization机制
Java语言提供了对象终止(finalization)机制来允许开发人员提供对象被销毁之前的自定义处理逻辑。当垃圾回收器发现没有引用指向一个对象,即:垃圾回收此对象之前,总会先调用这个对象的finalize() 方法。finalize() 允许子类中被重写,用于对象被回收时进行资源释放。通常在这个方法中进行一些资源释放和清理的工作,比如关闭文件,套接字和数据库连接等。Object类的方法protected void finalize() throws Throwable { }..原创 2021-06-23 00:52:46 · 216 阅读 · 1 评论 -
Java虚拟机-直接内存(Direct Memory)
JDK8 的时候采用的元空间(Metaspace) ,采用的是直接内存的方式。直接内存的概述不是虚拟机运行区的一部分,也不是java虚拟机规范中定义的内存区域。直接内存是在Java堆外的,直接像系统内存申请的一块区域。来源与 NIO,通过存在堆中的DirectByteBuffer操作Native内存。通常访问直接内存会优于Java,读写性能更高。:因此出于性能考虑,读写频繁的场合,可能会考虑直接内存。:Java的NIO库允许Java程序使用直接内存,用于数据缓冲区。..原创 2021-06-21 23:28:20 · 1050 阅读 · 0 评论 -
Java虚拟机-垃圾回收相关算法(如何识别对象是垃圾)
文章目录引用计数算法可达性分析算法对象存活判断在堆中存放着几乎所有的Java实例对象,在GC执行垃圾回收之前,首先需要区分出内存中哪些是存活对象,哪些是已经死亡的对象。只有被标记为已经死亡的对象,GC才会在执行垃圾回收时,释放掉其所占用的内存空间,因此我们可以称为垃圾的标记阶段。那么在JVM中究竟是如何标记一个死亡对象的呢?简单来说,当一个对象已经不再被任何的存活对象继续引用时,就可以宣判为已经死亡。引用计数算法对每个对象保存一个整型的引用计数属性。用于记录对象被引用的情况。对于一个对象A原创 2021-06-19 17:44:42 · 438 阅读 · 0 评论 -
Java虚拟机-垃圾收集器概述
文章目录什么是垃圾为什么需要GC早期垃圾回收Java垃圾回收机制什么是垃圾垃圾收集,不是Java语言的伴生产物,早在1960年,第一门开始使用内存动态分配和垃圾收集技术的Lisp语言诞生。关于垃圾收集的三个经典问题哪些内存需要回收?是那么时候回收?如何回收?什么是垃圾(Garbage)?垃圾是指在运行程序中没有任何指针指向的对象,这个对象就是需要被回收的垃圾。如果不及时对内存中的垃圾进行清理,那么,这些垃圾对象所占的内存空间会一直保留到应用程序结束,被保留的空间无法被原创 2021-06-17 20:42:44 · 98 阅读 · 2 评论 -
Java虚拟机-对象的访问定位
创建对象的目的是为了使用它;那么?jvm 是如何通过栈帧中的对象引用,访问到其内部的对象实例的呢。栈帧中存储了堆空间存储的对象地址references,对象中存储了其类型地址。对象访问有两种方式1.句柄访问 s2.直接指针(Hotspot采用)...原创 2021-06-14 16:04:27 · 88 阅读 · 0 评论 -
Java虚拟机-对象的内存布局
内存布局对象头(Herder)1 运行时数据区(Mark Word)哈希值(HashCode)GC分代年龄锁状态标志线程持有的锁偏向线程ID偏向时间戳2 指针类型指向类元数据(InstanceKlass)确定该对象所属类型3 如果是数组还需记录数组的长度实例数据(Instance Data)说明: 它是真正存储的有效信息,包括程序代码中定义的各种类型的字段(包括从父类继承下来的和本身拥有的字段)规则:相同宽度的字段总是被分配到一起;父类中的变量总会出现原创 2021-06-14 12:10:28 · 66 阅读 · 0 评论 -
Java虚拟机-创建对象的过程
文章目录对象的实例化对象的实例化创建对象的方式newClass的newInstance :反射的方式,只能调用空参的构造器,必须是publicConstructor的newInstance(xxx):反射的方式,可以调用有参数或者无参数构造器,权限没有要求。使用clone。不调用任何构造器,当前类需要实现Cloneable接口,实现 clone()方法。使用反序列化:从文件或者网络获取流第三方库Objenesis创建对象的步骤判断对象对应的类是否加载、链接、初始化为对象分配内原创 2021-06-09 23:36:07 · 94 阅读 · 0 评论 -
Java虚拟机---方法区
文章目录栈、堆、方法区 的相关关系方法区的理解栈、堆、方法区 的相关关系从线程共享角度来看交互关系上图:Person.class 对象是存储在方法区中,person局部变量是在Java栈中,new 的 Person 对象是存储在 Java 堆中。上图:Java栈中有一个 reference 的引用,引用到Java堆的具体对象中,对象中会存有具体方法区中的类对象的类型。方法区的理解方法区,独立于堆的一块独立空间各个线程共享的区域...原创 2021-05-25 21:14:22 · 242 阅读 · 3 评论 -
Java 对象分配过程
对象分配是一个严谨和复杂的任务,JVM的设计者们不仅需要考虑内存如何分配、在哪里分配的问题,并且由于内存分配算法与内存回收算法密切相关,所以还需要考虑GC执行完是否会在内存空间中产生内存碎片。...原创 2021-05-10 21:06:45 · 521 阅读 · 2 评论 -
Java 堆
Java堆对于 Java 应用程序来说,Java Heap 是虚拟机所管理内存中最大的一块,Java 堆是被所有线程共享的一块区域,在虚拟机启动时创建。此内存区域唯一的作用就是存放对象实例,Java 中几乎所有的对象实例都在这里分配内存。Java 堆是垃圾收集器所管理的内存区域,所以也称为 GC堆。从内存回收角度来看,由于现代垃圾收集器都是基于分代理论设计的,所以 Java 堆中经常会出现 新生代、老年代、永久代、Eden空间、From Survivor空间、To Survivor空间 等名词。原创 2021-04-17 20:16:03 · 91 阅读 · 0 评论 -
深入理解Java虚拟机
Java虚拟机-程序计数器原创 2021-04-10 18:10:40 · 122 阅读 · 0 评论 -
Java虚拟机栈
Java虚拟机栈java虚拟机栈和程序计数器一样,也是线程私有,生命周期与线程相同。虚拟机栈描述的是 Java 方法执行的线程内存模型:每个方法执行的时候,Java 虚拟机都会创建一个栈帧用于存储局部变量表、操作数栈、动态连接、方法出口等信息。每一个方法被调用直至执行完毕的过程,就对应着一个栈帧在虚拟机中从入栈到出栈的过程。...原创 2021-04-10 18:09:08 · 140 阅读 · 0 评论 -
JAVA虚拟机程序计数器
程序计数器(Program Counter Register)是一块比较小的内存空间,它可以看作当前线程所执行的字节码的行号指示器。在 Java 虚拟机的概念模型里,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节指令,它是程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都需要这个计数器来完成。下图就是字节码执行程序计数器需要记录的行号由于 Java 虚拟机的多线程是通过线程轮流切换、分配处理器执行时间的方式来实现的,任何一个确定时刻,一个处理器(或者一个.原创 2021-04-09 19:05:11 · 284 阅读 · 0 评论 -
反射机制的入门和进阶
文章目录反射基础反射进阶反射基础反射机制是在运行状态中,对任意一个类,都能够知道这个类的所有的属性和方法。反射是可以在一个类运行时的时候获得类的信息的机制。可以在编译器不可能获取的类的信息。对于任意一个对,都能调用它的任意一个方法和属性。因为类的信息是保存在 Class 对象中的,而这个 Class 对象是在运行时被类加载器(CLassLoader)动态加载的。当类加载器装载运行了类后,...原创 2020-03-23 16:59:09 · 138 阅读 · 0 评论 -
java基础之ArrayList和Vector的主要区别;
List接口下一共实现了三个类:ArrayList,Vector,LinkedList。 LinkedList主要保持数据的插入顺序的时候使用,采用链表结构。ArrayList,Vector主要区别为以下几点: (1):Vector是线程安全的,源码中有很多的synchronized可以看出,而ArrayList不是。导致Vector效率无法和ArrayList相比; (2):原创 2016-09-18 15:19:05 · 27622 阅读 · 0 评论