
深入理解Java虚拟机
文章平均质量分 62
一个人的见解,结合系统的图解,充分诠释虚拟机的工作原理
三日沐水
互联网如流水,三日不学则落后。【三日沐水】专注互联网行业动态、技术干货与实用工具,每日为你提供最新资讯与深度解析。无论你是开发者、产品经理还是创业者,这里都是你汲取灵感、提升技能的源泉。关注我们,与时代同行,让知识如水流般滋养你的成长!
展开
-
深入理解Java虚拟机(六)
通过可达性分析算法,标记内存中需要被回收的对象,在标记完成之后,进行清除操作。反过来,也可以标记存活的对象,清除全部未被标记的对象。优点:算法简单,执行效率高。缺点:(1)产生空间碎片化问题,标记,清除之后会产生大量不连续的内存碎片。(2)执行效率不稳定,执行效率随对象数量增长而降低。原创 2024-10-29 22:26:31 · 369 阅读 · 0 评论 -
深入理解ThreadLocal底层原理
如果ThreadLocal对象被回收了,那么ThreadLocalMap里面的Enrty数组元素Entry没有Key怎么办?ThreadLocal是线程私有的,各个线程之间是隔离的。>对象被弱引用对象WeakReference封装,随时可能会被GC回收。(2)当ThreadLocal第一次调用Set(Value)存储的时候。(3)创建Entry[16]数组,封装Entry对象ThreadLocal作为key一一对应。(1)当线程被创建时,线程都会有一个成员变量ThreadLocalMap。原创 2024-10-28 23:19:22 · 556 阅读 · 0 评论 -
深入理解Java虚拟机(五)
引用计数器在对象中添加一个引用计数器,当一个地方引用的时候,计数器+1,当引用失效时,计数器值就-1。但是在Java里面存在对象循环引用:objA 和 objB都有字段instance,赋值令objA.instance = objB及objB.instance = objA,除此之外,这两个对象再无任何引用。因为互相引用着对方,导致它们的引用计数都不为零,引用计数算法也就无法回收它们。原创 2024-10-28 22:03:32 · 925 阅读 · 0 评论 -
深入理解JAVA虚拟机(四)
线程真正有四个状态:无锁状态 (标识01,是否偏向0)、偏向锁(标识01、是否偏向1)、轻量级锁(标识00)、重量级锁(标识:10)。其中网上说的自旋锁只是一个重试自选的状态。原创 2024-10-27 21:47:20 · 454 阅读 · 0 评论 -
深入理解JAVA虚拟机(三)
java对象主要由如下三部分构成:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。其中对象头分为两部分:一部分存储运行时的数据(Mark Word)、另一部分指向所属类型的元数据的指针。重点介绍一下:Mark Word的构成。用于存储哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等。在32位系统中,Mark Word通常是32bit,类型指针32bit,加起来64bit。偏向时间戳Epoch。原创 2024-10-27 21:25:54 · 317 阅读 · 0 评论 -
深入理解JAVA虚拟机(一)
按照物理结构来划分:java虚拟机主要由以下几部分构成栈、堆和程序计数器,其中栈又可以分为虚拟机栈VM stack 和 本地方法栈 Native Method Statck,堆可以划分方法区和普通的堆内存。线程私有的,用于存储局部变量表、操作数栈、动态链接、方法出口,其中局部变量表存放的是基本数据类型和引用数据类型的Reference。意义上就是一个程序控制流的指示器,主要用于在线程轮流切换的时候,能够恢复到正确的执行位置,每个线程都有自己独立的程序计数器,各条线程之间计数器互不影响,独立存储。原创 2024-10-26 22:55:03 · 436 阅读 · 0 评论 -
深入理解JAVA虚拟机(二)
方案二:把内存分配的动作划分到不同的线程空间进行,预先给每个线程分配内心,在每个线程本地缓冲区中分配(Thread Local Allocation,TLAB),当本地缓冲区用完了,分配新的缓冲区时才需要同步锁定。当JAVA 执行NEW一个对象的时候,java对象创建流程就启动了,创建java对象主要分为三部分:类加载、解析、初始化。可能出现在给对象A分配内存,指针还没来得及修改,对象B又同时使用了原来的指针来分配内存的情况。方案一:CAS+失败重试的方式保证更新操作的原子性。原创 2024-10-27 00:11:08 · 323 阅读 · 0 评论 -
Windows10 环境下编译 OpenJdk12源码
cygwin安装的时候记得勾选make插件,版本必须是4.2.x,我选择的是4.2.1,不然后期编译make all的时候会报下面异常!解决方案2:修改: make\autoconf目录下的toolchain_windows.m4文件里面的内容。(2)注释掉: make\autoconf目录下的toolchain_windows.m4文件里面的内容。(1) 注释掉:make\autoconf目录下的toolchain.m4文件里面的内容。(3)在CygWin窗口下编译 openjdk12的源码。原创 2024-10-11 13:33:05 · 479 阅读 · 0 评论