深入理解JVM系列
文章平均质量分 68
努力努力再努力ss
这个作者很懒,什么都没留下…
展开
-
深入探索JVM高效并发 — Java与线程之状态转换
Java语言定义了6种线程状态,在任意一个时间点中,一个线程只能有且只有其中的一种状态,并且可以通过特定的方法在不同状态之间转换原创 2022-09-17 02:01:56 · 287 阅读 · 1 评论 -
深入探索JVM高效并发 — Java与线程之线程调度
线程调度是指系统为线程分配处理器使用权的过程,调度主要方式有两种,分别是协同式 (Cooperative Threads-Scheduling)线程调度和抢占式(Preemptive Threads-Scheduling)线程调度。原创 2022-09-17 01:59:46 · 303 阅读 · 0 评论 -
深入探索JVM高效并发 — Java与线程之线程的实现
线程是比进程更轻量级的调度执行单位,线程的引入,可以把一个进程的资源分配和执行调度分开,各个线程既可以共享进程资源(内存地址、文件I/O等),又可以独立调度。目前线程是Java里面进行处理器资源调度的最基本单位原创 2022-09-17 01:57:02 · 186 阅读 · 0 评论 -
深入探索JVM高效并发 — Java内存模型(四) 先行发生原则
如果两个操作之间的关系不在此列,并且无法从下列规则推导出来,则它们就没有顺序性保障,虚拟机可以对它们随意地进行重排序。):在一个线程内,按照控制流顺序,书写在前面的操作先行发生于书写在后面的操作。这个原则非常重要,它是判断数据是否存在竞争,线程是否安全的非常有用的手段。):线程中的所有操作都先行发生于对此线程的终止检测,我们可以通过。):一个对象的初始化完成(构造函数执行结束)先行发生于它的。方法先行发生于此线程的每一个动作。的代码检测到中断事件的发生,可以通过。先行发生:逻辑上的发生,按照代码顺序。原创 2022-09-17 01:54:11 · 193 阅读 · 0 评论 -
深入探索JVM高效并发 — Java内存模型(三) 原子性、可见性与有序性
内存模型是通过在变量修改后将新值同步回主内存,在变量读取前从主内存刷新变量值这种依赖主内存作为传递媒介的方式来实现可见性的,无论是普通变量还是。程序中天然的有序性可以总结为一句话:如果在本线程内观察,所有的操作都是有序的;如果在一个线程中观察另一个线程,所有的操作都是无序的。的非原子性协定,只要知道这件事情就可以了,无须太过在意这些几乎不会发生的例外情况)。这六个,我们大致可以认为,基本数据类型的访问、读写都是具备原子性的(例外就是。这条规则获得的,这个规则决定了持有同一个锁的两个同步块只能串行地进入。原创 2022-09-17 01:53:28 · 208 阅读 · 0 评论 -
深入探索JVM高效并发 — Java内存模型(二)
普通的变量仅会保证在该方法的执行过程 中所有依赖赋值结果的地方都能获取到正确的结果,而不能保证变量赋值操作的顺序与程序代码中的执行顺序一致。变量读操作的性能消耗与普通变量几乎没有什么差别,但是写操作则可能会慢上一些,因为它需要在本地代码中插入许多内存屏障指令来保证处理器不发生乱序执行。是指当一条线程修改了这个变量的值,新值对于其他线程来说是可以立即得知的。运算结果并不依赖变量的当前值,或者能够确保只有单一的线程修改变量的值。修饰的变量不会被指令重排序优化,从而保证代码的执行顺序与程序的顺序相同。原创 2022-09-17 01:51:32 · 209 阅读 · 0 评论 -
深入探索JVM高效并发 — Java内存模型(一)
“Java内存模型”(Java Memory Model,JMM)来屏蔽各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的内存访问效果。原创 2022-09-17 01:50:35 · 179 阅读 · 0 评论 -
深入探索JVM高效并发 — Java内存模型与线程
证该结果与顺序执行的结果是一致的,如果存在一个计算任务依赖另外一个计算任务的中间结果,那么其顺序性并不能靠代码的先后顺序来保证。与处理器的乱序执行优化类似,Amdahl定律通过系统中并行化与串行化的比重来描述多处理器系统能获得的运算加速能力,摩尔 定律则用于描述处理器晶体管数量与运行效率之间的发展关系。除了充分利用计算机处理器的能力外,一个服务端要同时对多个客户端提供服务,则是另一个更具体的并发应用场景。在许多场景下,让计算机同时去做几件事情,不仅是因为计算机的运算能力强大了,还有一个很重要的原因是。原创 2022-09-17 01:45:18 · 249 阅读 · 0 评论 -
深入探索JVM字节码执行引擎 — 方法调用
这种解析能够成立的前 提是:方法在程序真正运行之前就有一个可确定的调用版本,并且这个方法的调用版本在运行期是不 可改变的。解析调用一定是个静态的过程,在编译期间就完全确定,在类加载的解析阶段就会把涉及的符号 引用全部转变为明确的直接引用,不必延迟到运行期再去完成。两 大类,前者与类型直接关联,后者在外部不可被访问,这两种方法各自的特点决定了它们都不可能通 过继承或别的方式重写出其他版本,因此它们。,都可以在解析阶段中确定唯一的调用版本, Java语言里符合这个条件的方法共有。用于调用所有的虚方法。原创 2022-09-16 00:01:58 · 80 阅读 · 0 评论 -
深入探索JVM字节码执行引擎 — 操作数栈、动态连接、方法返回地址
例如整数加法的字节码指令iadd,这条指令在运行的时候要 求操作数栈中最接近栈顶的两个元素已经存入了两个int型的数值,当执行这个指令时,会把这两个int 值出栈并相加,然后将相加的结果重新入栈。方法退出的过程实际上等同于把当前栈帧出栈,因此退出时可能执行的操作有:恢复上层方法的 局部变量表和操作数栈,把返回值(如果有的话)压入调用者栈帧的操作数栈中,调整PC计数器的值 以指向方法调用指令后面的一条指令等。,方法是否有返回值以及返回值的类型将根据遇到何种方法返回指令来决定,这种 退出方法的方式称为。原创 2022-09-15 23:59:27 · 149 阅读 · 0 评论 -
深入探索JVM字节码执行引擎 — 运行时栈帧结构、局部变量表
虚拟机”是一个相对于“物理机”的概念,这两种机 器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层 面上的,而虚拟机的执行引擎则是由软件自行实现的,因此可以不受物理条件制约地定制指令集与执 行引擎的结构体系,能够执行那些不被硬件直接支持的指令集格式。如果访问的是32位数据类型的变量,索引N就代表了使用第N个变量槽,如果访问的是64位 数据类型的变量,则说明会同时使用第N和N+1两个变量槽。在不同的虚拟机实现中,执行引擎在执行字节码的 时候,通常会有。原创 2022-09-15 23:57:57 · 192 阅读 · 0 评论 -
深入探索JVM类加载机制 —Java模块化系统
JDK 9中虽然仍然维持着三层类加载器和双亲委派的架构,但类加载的委派关系也发生了 变动。当平台及应用程序类加载器收到类加载请求,在委派给父加载器加载前,要先判断该类是否能 够归属到某一个系统模块中,如果可以找到这样的归属关系,就要优先委派给负责那个模块的加载器 完成加载,也许这可以算是对双亲委派的第四次破坏。原创 2022-09-15 23:52:01 · 162 阅读 · 0 评论 -
深入探索JVM类加载机制 — 类加载器之破坏双亲委派模型
类加载器之破坏双亲委派模型原创 2022-09-15 23:49:05 · 213 阅读 · 0 评论 -
深入探索JVM类加载机制 — 类加载器之双亲委派模型
类加载器Java虚拟机设计团队有意把类加载阶段中的“通过一个类的全限定名来获取描述该类的二进制字节 流”这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需的类。实现这个动 作的代码被称为“类加载器”(Class Loader)。原创 2022-09-15 23:47:20 · 216 阅读 · 0 评论 -
深入探索JVM类加载机制 — 类加载的过程之初始化
类加载的过程之初始化原创 2022-09-15 23:43:36 · 100 阅读 · 0 评论 -
深入探索JVM类加载机制 — 类加载的过程之准备、解析
类加载的过程之准备、解析原创 2022-09-15 23:42:04 · 166 阅读 · 0 评论 -
深入探索JVM类加载机制 — 类加载的过程之加载、验证
类加载的过程加载、验证、准备、解析和初始化这五 个阶段所执行的具体动作原创 2022-09-15 23:40:11 · 332 阅读 · 0 评论 -
深入探索JVM类加载机制 — 类加载的时机
一个类型从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期将会经历加载 (Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化 (Initialization)、使用(Using)和卸载(Unloading)七个阶段,其中验证、准备、解析三个部分统称 为连接(Linking)原创 2022-09-15 23:38:32 · 105 阅读 · 0 评论 -
深入探索JVM类文件结构 — Class类文件的结构(二)
访问标志、常量池原创 2022-09-14 22:51:25 · 131 阅读 · 0 评论 -
深入探索JVM类文件结构 — Class类文件的结构(一)
任何一个Class文件都对应着唯一的一个类或接口的定义信息,但是反过来说,类或 接口并不一定都得定义在文件里(譬如类或接口也可以动态生成,直接送入类加载器中)。本章中, 笔者只是通俗地将任意一个有效的类或接口所应当满足的格式称为“Class文件格式”,实际上它完全不 需要以磁盘文件的形式存在。原创 2022-09-14 22:47:33 · 84 阅读 · 0 评论 -
深入探索JVM类文件结构 — 平台无关性的基石
字节码(Byte Code) 是构成平台无关性的基石原创 2022-09-14 22:45:48 · 359 阅读 · 0 评论 -
深入探索JAVA虚拟机(JVM )— 内存调优
常⽤调优⼯具分为两类, jdk⾃带监控⼯具:jconsole 和 jvisualvm,第三⽅有:MAT(Memory Analyzer Tool)、GChisto。 • jconsole,Java Monitoring and Management Console是从java5开始,在JDK中⾃带的java监控和管理控制台,⽤于对JVM中内存,线程和类等的监控原创 2022-09-14 20:10:19 · 247 阅读 · 0 评论 -
深入探索JVM垃圾收集器 — 内存分配与回收策略
Java技术体系的自动内存管理,最根本的目标是自动化地解决两个问题:自动给对象分配内存以 及自动回收分配给对象的内存。对象的内存分配,从概念上讲,应该都是在堆上分配对象优先在Eden分配:原创 2022-09-14 20:05:00 · 72 阅读 · 0 评论 -
深入探索JVM垃圾收集器 — 选择合适的垃圾收集器
衡量垃圾收集器的三项最重要的指标是: 内存占⽤(Footprint)、吞吐量(Throughput)和延 迟(Latency),三者共同构成了⼀个“不可能三⻆”。三者总体的表现会随技术进步⽽越来越好,但是要在这三个⽅⾯同时具有卓越表现的“完美”收集器是极其困难甚⾄是不可能的,⼀款优秀的收集器通常最多可以同时达成其中的两项。原创 2022-09-13 17:10:51 · 189 阅读 · 0 评论 -
深入探索JVM垃圾收集器 — 经典垃圾收集器之Garbage First收集器(G1)
Garbage First(简称G1)收集器是垃圾收集器技术发展历史上的里程碑式的成果,它开创了收集 器面向局部收集的设计思路和基于Region的内存布局形式。被Oracle官方称为“全功能的垃圾收集 器”。原创 2022-09-13 17:08:43 · 212 阅读 · 0 评论 -
深入探索JVM垃圾收集器 — 经典垃圾收集器之CMS收集器
CMS收集器(基于 标记-清除算法 老年代 )原创 2022-09-13 14:29:43 · 212 阅读 · 0 评论 -
深入探索JVM垃圾收集器 — 经典垃圾收集器之Parallel Scavenge收集器、Serial Old收集器、Parallel Old收集器
Parallel Scavenge收集器、Serial Old收集器、Parallel Old收集器原创 2022-09-13 14:17:49 · 1081 阅读 · 0 评论 -
深入探索JVM垃圾收集器 — 经典垃圾收集器之Serial收集器、ParNew收集器
Serial收集器 (基于 标记-复制算法 新生代)、ParNew收集器 (基于 标记-复制算法 新生代)原创 2022-09-13 14:12:29 · 190 阅读 · 0 评论 -
深入探索JVM垃圾收集器 — HotSpot的算法细节实现(三)
并发的可达性分析原创 2022-09-13 14:04:40 · 77 阅读 · 0 评论 -
深入探索JVM垃圾收集器 — HotSpot的算法细节实现(二)
记忆集与卡表、卡表、写屏障、解决“伪共享”(False Sharing)问题原创 2022-09-13 14:03:03 · 114 阅读 · 0 评论 -
深入探索JVM垃圾收集器 — HotSpot的算法细节实现 (一)
我们以可达性分析算法中从GC Roots集合找引⽤链这个操作作为介绍虚拟机⾼效实现的第⼀个例⼦。 在HotSpot的解决⽅案⾥,是使⽤⼀组称为OopMap的数据结构来达到这个⽬的。⼀旦类加载动作完成的时候, HotSpot就会把对象内什么偏移量上是什么类型的数据计算出来,在即时编译过程中,也会在特定的位置记录下栈⾥和寄存器⾥哪些位置是引⽤。这样收集器在扫描时就可以直接得知这些信息了,并不需要真正⼀个不漏地从⽅法区等GC Roots开始查找。原创 2022-09-13 14:01:30 · 86 阅读 · 0 评论 -
深入探索JVM垃圾收集器 — 垃圾收集算法之 标记-整理算法
针对老年代对象的存亡特征,有针对性的“标记-整 理”(Mark-Compact)算法,其中的标记过程仍然与“标记-清除”算法一样,但后续步骤不是直接对可 回收对象进行清理,而是让所有存活的对象都向内存空间一端移动,然后直接清理掉边界以外的内 存。原创 2022-09-13 12:18:20 · 180 阅读 · 0 评论 -
深入探索JVM垃圾收集器 — 垃圾收集算法之 标记-清除算法、标记-复制算法
最早出现也是最基础的垃圾收集算法是“标记-清除”(Mark-Sweep)算法。标记-复制算法简称为复制算法。它将可用 内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着 的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。原创 2022-09-13 12:16:27 · 164 阅读 · 0 评论 -
深入探索JVM垃圾收集器 — 垃圾收集算法之分代收集理论
当前商业虚拟机的垃圾收集器,大多数都遵循了“分代收集”(Generational Collection)的理论进行设计原创 2022-09-12 22:20:52 · 154 阅读 · 2 评论 -
深入探索JVM垃圾收集器 — 回收方法区
《Java虚拟机规范》中提到过可以不要求虚拟机在方法区中实现垃圾收集。方法区的垃圾收集主要回收两部分内容:废弃的常量和不再使用的类型。原创 2022-09-12 22:15:21 · 239 阅读 · 0 评论 -
深入探索JVM垃圾收集器—哪些内存需要回收、什么时候回收
垃圾收集需要完成的三件事情:.哪些内存需要回收?·什么时候回收?·如何回收?原创 2022-09-12 22:13:37 · 602 阅读 · 0 评论 -
Java虚拟机对象的探索—对象的访问定位
对象访问方式是由虚拟机实现而定,主流的访问方式主要有使用句柄和直接指针两种;原创 2022-09-12 22:02:55 · 99 阅读 · 0 评论 -
Java虚拟机对象的探索—对象的内存布局
在HotSpot虚拟机里,对象在堆内存中的存储布局可以划分为三个部分:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。原创 2022-09-12 22:00:31 · 197 阅读 · 0 评论 -
Java虚拟机对象的探索—对象的创建
当Java虚拟机遇到一条字节码new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,那必须先执行相应的类加载过程。原创 2022-09-12 21:56:46 · 71 阅读 · 0 评论 -
深入理解Java内存区域 — 运行时常量池(方法区的一部分)、直接内存
运行时常量池(方法区的一部分);直接内存(Direct Memory)并不是虚拟机运行时数据区的一部分,也不是《Java虚拟机规范》中定义的内存区域。原创 2022-09-12 21:45:50 · 248 阅读 · 0 评论