![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
JVM
文章平均质量分 79
柒间
这个作者很懒,什么都没留下…
展开
-
垃圾收集算法
而老年代的对象存活几率是比较高的,而且没有额外的空间对它进行分配担保,所以我们必须选择“标记-清除”或“标记-整理”算法进行垃圾收集。算法分为“标记”和“清除”阶段:标记存活的对象, 统一回收所有未被标记的对象(一般选择这种);当前虚拟机的垃圾收集都采用分代收集算法,这种算法没有什么新的思想,只是根据对象存活周期的不同将内存分为几块。根据老年代的特点特出的一种标记算法,标记过程仍然与“标记-清除”算法一样,但后续步骤不是直接对可回收对象回收,而是让所有存活的对象向一端移动,然后直接清理掉端边界以外的内存。原创 2023-04-27 14:15:05 · 115 阅读 · 1 评论 -
从JDK源码级别彻底剖析JVM类加载机制
● 加载:在硬盘上查找并通过IO读入字节码文件,使用到类时才会加载,例如调用类的main()方法,new对象等等,在加载阶段会在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口。双亲委派机制,加载某个类时会先委托父加载器寻找目标类,找不到再委托上层父加载器加载,如果所有父加载器在自己的加载类路径下都找不到目标类,则在自己的类加载路径中查找并载入目标类。● 扩展类加载器:负责加载支撑JVM运行的位于JRE的lib目录下的ext扩展目录中的JAR类包。原创 2023-04-26 11:23:24 · 376 阅读 · 0 评论 -
JVM类加载机制
类加载过程 ;自定义类加载器只需要继承 java.lang.ClassLoader 类,该类有两个核心方法,一个是loadClass(String, boolean),实现了双亲委派机制,还有一个方法是findClass,默认实现是空方法,所以我们自定义类加载器主要是重写findClass方法。try {//defineClass将一个字节数组转为Class对象,这个字节数组是class文件读取后最终的字节数组。...原创 2022-08-13 23:54:04 · 108 阅读 · 0 评论 -
对象的共享
Java并发编程实战学习笔记。要编写正确的并发程序,关键问题在于:在访问共享的可变状态时需要进行正确的管理。可见性可见性是一种复杂的属性,可见性的错误总会违背我们的直觉。当写操作和读操作在不同的线程中执行的时候,我们无法确保执行读操作的线程能适时的看到其他线程写入的值,有时甚至是更本是不可能的事情。为了确保多个线程之间对内存写入操作的可见性,必须是有同步机制。 程序Novisibility说明了当前线程在没有同步的情况下共享数据时出现的错误。在代码中,主线程和读线程都访问共享ready和numbe原创 2021-11-25 23:16:54 · 429 阅读 · 1 评论 -
JDK1.7与JDK1.8中HashMap的扩容
基础知识注意Java中散列表用链表数组实现,每个链表被称为桶,想要查找表中对象的位置,就要先计算它的散列码,然后与桶的总数取余数,所得到的结果就是保存这个元素桶的索引。hash:翻译为”散列表“,就是把任意长度的输入,通过散列算法,变成固定长度输出,该输出结果是散列值。这种转换是一种压缩映射,散列表的空间通常小于输入的空间,不同的输入可能会散列成相同的输出,所以不能从散列表来唯一的确定输入值。hash冲突:就是根据key即经过一个函数f(key)得到的结果的作为地址去存放当前的key value原创 2021-10-31 17:31:09 · 1913 阅读 · 0 评论 -
i++与++i分析 (操作数栈)
什么是操作栈? 操作数栈也被称为操作栈,它是一个后入先出栈。操作数栈中的每一个元素都是包括long和double在内的任意java类型。32位数据类型所栈的栈容量为1,64位数据类型所占的栈容量为2.当一个方法刚刚开始执行的时候,这个方法的操作数栈是空的做算术运算的时候是通过将运算涉及的操作数栈压入顶后调用运算指令来进行的,在调用其他的方法的时候是通过操作数栈来进行方法参数来进行值传递的。自增自减对JVM来说是怎样操作的在学习中我们一直被告诫,在Java中任何赋值操作都不是原子操作!并且自原创 2021-08-07 21:29:50 · 508 阅读 · 0 评论 -
双重检查锁单例与内存屏障分析
单例(双重检查锁)public class DoubleCheckLockSingleton { private static DoubleCheckLockSingleton instance = null; private DoubleCheckLockSingleton(){ } public static DoubleCheckLockSingleton getInstance() { if (instance == null){原创 2021-08-06 14:38:36 · 243 阅读 · 0 评论 -
volatile关键字再理解
线程、主内存、工作内存文章的之前我们先连接一点JVM的知识。以便后期的理解Java内存模型规定了所有的变量都存储在主内存(Main Memory)中(此处的主内存与介绍物理硬件时提到的主内存名字一样,两者也可以类比,但物理上它仅是虚拟机内存的一部分)。每条线程还有自己的工作内存(Working Memory),可与处理器高速缓存类比,线程的工作内存中保存了被该线程使用的变量的主内存副本,线程对变量的所有操作(读取、赋值等)都必须在工作内存中进行,而不能直接读写主内存中的数据。不同的线程之间也无法直接访原创 2021-08-05 23:52:15 · 98 阅读 · 0 评论 -
Java中的引用
JDK1.2后进行了扩充强引用关联的对象不会被回收(无论何种情况下,只要强引用关系还在,垃圾收集器就永远不会回收掉被引用的对象)对于强引用我们开始学Java的时候是使用的最多的,就是我们栈内存定义一个类型的申明,指向堆中的一个对象的实例,这就是一个强引用。用代码来描述最简洁了。Object obj = new Object();如果这个对象不需要了,需要弱化从而使GC能够回收。例如:obj = null;这之后GC会认为对象的引用不存在(通过可达性分析算法),就是说GC从GC Roots节点开始原创 2021-08-02 16:52:46 · 79 阅读 · 0 评论 -
如何判断一个对象是否是可回收
判断一个对象是否可回收Java的内存管理子系统,是通过可达性分析算法来判定对象是否存活。引用计数法给对象添加一个引用计数器,每当有一个地方引用,计数器就加 1 。当引用失效,计数器就减 1 。任何时候计数器为 0 的对象就是不可能再被使用的。引用计数法实现简单,效率高,但是目前主流的虚拟机中没有选择这个算法来管理内存,最主要的原因是它很难解决对象之前相互循环引用的问题。相互引用:/** * 将Main class设置为想要查看GC日志的类 * VM options : -XX:+Print原创 2021-07-29 17:06:52 · 219 阅读 · 0 评论