JVM
文章平均质量分 89
逐步了解JVM
有什么奇怪!
大学在读,入坑计算机
展开
-
对象内存布局和synchronized锁升级
偏向锁适用于单线程适用的情况,在不存在锁竞争的时候进入同步方法/代码块则使用偏向锁。轻量级锁适用于竞争较不激烈的情况(这和乐观锁的使用范围类似),存在竞争时升级为轻量级锁,轻量级锁采用的是自旋锁,如果同步方法/代码块执行时间很短的话,采用轻量级锁虽然会占用cpu资源但是相对比使用重量级锁还是更高效。重量级锁适用于竞争激烈的情况,如果同步方法/代码块执行时间很长,那么使用轻量级锁自旋带来的性能消耗就比使用重量级锁更严重,这时候就需要升级为重量级锁。...原创 2022-07-16 22:37:15 · 164 阅读 · 0 评论 -
三色标记清除法
三色标记清除法:白色(未扫描到)黑色(扫描到且子节点也扫描到)灰色(扫描到但子节点没有完全扫描完)原创 2022-06-20 17:03:54 · 809 阅读 · 0 评论 -
垃圾回收器
经典垃圾回收器:SerialGC、Serial Old GC、ParNew GC、 Parallel scavenge GC、Parallerl Old GC、CMS、G1原创 2022-06-20 11:24:45 · 1449 阅读 · 0 评论 -
垃圾回收相关概念
强引用:有引用不回收软引用:内存不足回收弱引用:只存活一个垃圾回收周期虚引用:回收不影响,且回收时会发出通知原创 2022-06-16 10:25:46 · 174 阅读 · 0 评论 -
垃圾回收相关算法
垃圾标记算法:1.引用计数算法2.可达性分析算法垃圾清除算法:1.标记-清除算法2.标记-复制算法3.标记-压缩算法原创 2022-06-14 23:23:14 · 298 阅读 · 1 评论 -
垃圾回收概述
我们对于垃圾回收,常常需要思考这三点:1. 哪些内存需要回收?2. 什么时候回收?3. 如何回收?原创 2022-06-13 16:59:53 · 203 阅读 · 0 评论 -
StringTable
String字符串,不可变,无论是拼接还是改变,都会重新new一个String对象。String对象存在缓冲池,叫做字符串常量池,jdk6以前在元空间,jdk7后在堆空间。原创 2022-06-13 11:40:11 · 403 阅读 · 0 评论 -
执行引擎-(编译器、JIT)
执行引擎是JVM核心组成之一,由于操作系统只能识别机器指令,想要在机器上执行程序,不管什么语言最终都需要转换成机器指令。JVM中的执行引擎主要将字节码指令转换为机器指令并执行执行引擎的工作流程:Java代码的编译器有两种,一种是前端编译器,一种是后端编译器前端编译器,如javac,即将java文件编译成class文件:后端编译器,即将class文件中的字节码指令编译成本地机器指令:默认情况下,HotSpot VM采用解释器与JIT编译器并存的架构,开发者可以通过参数设置完全使用解释器,还是完全使用JIT原创 2022-06-08 21:59:14 · 918 阅读 · 0 评论 -
对象的实例化和访问
对象实例化的步骤1.判断对象对应的类是否加载、链接、初始化 2.为对象分配内存 3.处理并发安全问题 4.默认初始化 5.设置对象的对象头 6.显式初始化对象的内存布局:堆中的对象由对象头+实例数据+对齐填充 组成对象头由类型指针和运行时元数据(哈希值 + GC分代年龄 + 锁状态标志 + 线程持有锁 + 偏向线程ID + 偏向时间戳)组成...原创 2022-06-08 13:10:41 · 288 阅读 · 0 评论 -
运行时常量区-方法区
《Java虚拟机规范》明确提出:尽管所有的方法区在逻辑上是属于堆的一部分,但一些简单的实现可能不会选择实现。对HotSpotJVM而言,方法区还有一个别名叫做Non-Heap(非堆),目的就是要和堆分开,为此方法区可以看成一块独立的内存。方法区包含了类型信息,常量,静态变量,JIT代码缓存。...原创 2022-06-07 17:10:55 · 757 阅读 · 0 评论 -
运行时数据区-堆
堆分为年轻代、老年代、(永久代或元空间)。年轻代和老年代的大小默认是1:2年轻代又分为(Eden区,s0区、s1区),这三个的大小默认是8:1:1在HotSpot中,对象只会在堆中分配,并未实现真正的栈上分配,而是默认是标量替换。...原创 2022-06-06 18:57:09 · 221 阅读 · 1 评论 -
运行时数据区-本地方法栈
本地方法就是一个Java调用非Java代码的接口。且本地方法和本地方法接口都不在运行时数据区。使用native修饰的方法就称为本地方法。原创 2022-06-05 09:31:42 · 121 阅读 · 0 评论 -
运行时数据区-虚拟机栈
由于JVM的跨平台的设计,Java的指令都是根据栈来设计的。不同平台CPU架构不同,所以不能设计为基于寄存器的。JVM中栈管运行,堆管存储每个线程在创建时都会创建一个虚拟机栈,该虚拟机栈是线程私有的,生命周期和线程一致, 其内部保存一个个的栈帧(Stack Frame),对应一次次的Java方法调用...原创 2022-06-04 21:43:19 · 141 阅读 · 0 评论 -
运行时数据区——程序计数器
JVM中的程序计数寄存器是线程私有的,它的生命周期伴随着整个线程PC寄存器用来存储指向下一条指令的地址,即将要执行的指令代码。由存储引擎读取下一条指令。原创 2022-06-04 19:39:28 · 303 阅读 · 0 评论 -
类加载过程
类加载过程:加载链接(检验,准备,解析)初始化原创 2021-08-13 17:17:23 · 151 阅读 · 0 评论 -
双亲委派机制
双亲委派机制原创 2021-08-16 20:12:38 · 173 阅读 · 0 评论