
JVM
文章平均质量分 84
JVM,java虚拟机专栏
G丶AEOM
我们都在追求更完美的自己!
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
垃圾收集器
常见的垃圾回收器: 新生代收集器(高吞吐量): Serial、ParNew、Parallel Scavenge 老年代收集器(SWT停顿时间): Serial Old、CMS、Parallel Old 新生代和老年代收集器: G1、ZGC、Shenandoah由于新生代和老年代垃圾收集的场景不同,所以需要不同的算法。而混合算法,一个就可以针对不同场景原创 2024-09-29 15:36:15 · 1368 阅读 · 0 评论 -
各个版本JDK用啥垃圾收集器,怎么看
G1 收集器具有很多特点和优势,比如它将堆内存划分为多个大小相等的 Region(区域),可以并发地进行垃圾回收,并且在回收时能够优先回收垃圾最多的那些 Region,从而在一定程度上减少应用暂停的时间(即减少 “stop the world” 时间),适用于对停顿时间敏感、内存较大(通常建议堆内存 8G 及以上效果更好)的应用场景,像很多现代的 Web 应用、微服务架构中的服务等,需要在保证内存有效回收的同时,尽量降低因垃圾回收导致的服务响应延迟。这个参数指定了在并发标记阶段使用的线程数量。原创 2024-11-25 17:53:59 · 1905 阅读 · 0 评论 -
三色标记算法
三色标记算法是根可达算法的一种实现方案,其目的是为了找出所有可达对象。三色标记算法会产生多标和漏标问题,其中漏标问题最严重。漏标问题会导致本该存活的对象被回收,从而导致严重的程序问题。原创 2024-10-03 09:57:29 · 682 阅读 · 0 评论 -
双亲委派机制
双亲委派机制是 Java 虚拟机(JVM)类加载机制中的一种层次化的类加载策略。当一个类加载器(ClassLoader)收到类加载请求时,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器。只有当父类加载器无法完成加载任务(即它在自己的搜索范围内找不到对应的类)时,子加载器才会尝试自己去加载。这种机制就像一个孩子(子加载器)遇到问题先问父母(父加载器),只有父母解决不了才自己动手原创 2024-10-23 17:32:07 · 1301 阅读 · 0 评论 -
ZGC理解
因此,ZGC 很巧妙的将并发重映射阶段要做的工作,合并到了下一次GC中的并发标记阶段里去完成,反正它代都是要遍历对象,这样就节省了一次遍历的开销。ZGC(Z Garbage Collector) 是一款基于动态Region 内存布局的,暂时不设分代的,使用了读屏障、颜色指针等技术来实现可并发的,采用标记-整理算法的, 以低延迟为首要目标的一款垃圾收集器。所截获,然后立即根据Region 上的转发表记录将访问转发到新复制的对象上并同时修正更新该引用的值,使其直接指向新对象, ZGC 的这种行为称作。原创 2024-11-20 18:20:11 · 1777 阅读 · 0 评论 -
必须G1垃圾收集器
Garbage First(简称G1)收集器开创了局部收集的设计思路和基于Region的内存布局形式。虽然G1也仍是遵循分代收集理论设计的,但其堆内存的布局与其他收集器有非常明显的差异。以前的收集器分代是划分新生代、老年代、持久代(永久代)等。G1把连续的Java堆划分为多个大小相等的独立区域(Region),每一个Region都可以根据需要,扮演新生代的Eden空间、Survivor空间,或者老年代空间。收集器能够对扮演不同角色的Region采用不同的策略去处理。原创 2024-11-18 20:29:22 · 1582 阅读 · 0 评论 -
JVM垃圾回收
一、设计目标和适用场景设计目标:同时注重低停顿时间和高吞吐量,可以在不牺牲大量吞吐量的情况下实现较短的停顿时间,适用于大内存应用和对响应时间有较高要求的场景。适用场景:例如需要快速响应的交互式应用、大规模数据处理等,尤其是在堆内存较大(几个 GB 甚至更大)时表现出色。设计目标:主要是为了降低垃圾收集的停顿时间,以满足对响应时间要求较高的应用。适用场景:适合于对停顿时间比较敏感的应用,如互联网应用、Web 服务器等。原创 2024-10-22 17:20:26 · 1872 阅读 · 0 评论 -
JVM常用参数配置
JVM(Java虚拟机)参数配置对Java应用的性能、内存管理和调试等方面有重要作用。了解常见的参数配置对于优化应用性能、预防和解决问题、适应不同环境以及提高开发效率都具有重要意义原创 2024-09-19 19:25:43 · 519 阅读 · 0 评论 -
JVM逃逸分析机制
JVM 逃逸分析(Escape Analysis)是一种可以有效优化 Java 程序性能的技术手段,它是 Java 虚拟机在编译阶段(即时编译器,Just In Time compiler,JIT)进行的一项重要的优化分析工作。逃逸分析主要用于判断对象的作用域是否会 “逃逸” 出当前方法、线程或者其他特定的代码范围,如果对象不会逃逸,那么虚拟机就可以基于此进行一些针对性的优化。原创 2024-11-23 18:42:28 · 834 阅读 · 0 评论 -
JVM中TLAB(线程本地分配缓存区)是什么
TLAB 就是为了解决这个问题而出现的,它是在 Java 堆内存中的一块线程专属的内存区域,每个线程在创建对象时,首先会尝试在自己的 TLAB 区域内分配内存,这样多个线程在分配对象空间时就相当于在各自独立的 “小空间” 里操作,无需频繁地加锁竞争,从而提高了对象分配的效率,尤其是在多线程并发创建大量对象的场景下,对性能的提升效果较为显著。例如,在 HotSpot JVM 中,线程启动后会从伊甸园区分配一块初始的 TLAB 区域给它,这个区域一开始就是空闲的,等待线程后续创建对象时使用。原创 2024-11-23 18:41:52 · 1072 阅读 · 0 评论 -
JVM内存分配机制,内存模型
可以确保每个对象,数组运行时获得合适的存储空间,同时涉及垃圾回收机制,以回收不再使用的对象所占用的内存,避免内存泄漏和溢出。,它是java运行时数据区的一种规范,定义了JVM在执行java过程中如何管理内存,五个主要部分有堆、(虚拟机)栈、方法区、程序计数器和本地方法栈,是JVM中最大的内存区域,用于存储对象实例和数组,可以动态扩展堆内存,由JVM垃圾回收器负责管理对象的内存分配和释放。是每个线程私有的,用于存储当前线程正在执行的字节码指令地址,在多线程环境下,不同线程的程序计数器相互独立,互不影响。原创 2024-10-20 17:30:00 · 384 阅读 · 0 评论 -
JVM new对象时,堆会发生抢占吗?JVM怎么保证线程安全
默认情况下,TLAB 空间的内存非常小,仅占有整个 Eden 空间的 1%,我们可以通过 -XX:TLABWasteTargetPercent 设置 TLAB 空间所占用 Eden 空间的百分比大小。如果通过TLAB分配失败的时候,则会回到Eden区通过 CAS 方式进行分配。每个线程在Java堆中预先分配一小块内存,也就是本地线程分配缓冲(Thread Local AllocationBuffer,TLAB),要分配内存的线程,先在本地缓冲区中分配,只有本地缓冲区用完了,分配新的缓存区时才需要同步锁定。原创 2024-09-25 15:01:18 · 358 阅读 · 0 评论 -
JVM 内存结构中哪些区域可能发生 OOM
当一个线程执行一个方法时,会在虚拟机栈中为这个方法创建一个栈帧,方法执行完毕后栈帧会被弹出。如果线程执行的方法嵌套过深(如递归调用没有正确的终止条件),或者每个栈帧占用的内存过大,就可能导致虚拟机栈的内存空间被耗尽,从而发生虚拟机栈内存溢出(StackOverflowError,本质上也是一种 OOM 情况)。例如,一个长时间运行的 Web 应用,不断接收并处理大量用户请求,每个请求可能会创建一些业务对象,如果没有对这些对象进行有效的管理(如及时清理不再使用的对象),随着时间的推移,堆内存就可能被耗尽。原创 2024-11-06 18:00:00 · 1064 阅读 · 0 评论 -
谈谈你对JVM的理解
在 Java中,Class⽂件是由源码⽂件⽣成的,⾄于源码⽂件的内容,是每个 Java开发者在 JavaSE阶段的必备知识,这⾥就不再赘述了,我们可以关注⼀下 Class⽂件的格式,⽐如其中的常量池、成员变量、⽅法等,这样就能知道 Java源码内容在 Class⽂件中的表示⽅式。我们先看下目前主流的 JVM HotSpot的架构图,通过这张架构图,我们可以看出 JVM的大致流程是把一个class文件通过类加载器加载进系统,然后放到不同的区域,通过编译器编译。就是对运⾏时数据区中的数据进⾏管理和回收。原创 2024-10-24 17:26:31 · 580 阅读 · 0 评论 -
JVM类加载机制,一文搞懂相关细节!
初始化:执行类构造器阶段,由编译器自动收集类中所有类变量的赋值动作和静态代码块,通常这个阶段才是真正的为变量赋值正确的初始值,这是类加载的最后阶段,只有在类被主动使用时才会触发初始化。在 Java 虚拟机中,符号引用是一组符号来描述所引用的目标,它包括类和接口的全限定名、字段的名称和描述符、方法的名称和描述符等。加载:类加载阶段,通过类的全限定名获取二进制字节流,并将其转化为方法区的运行时数据结构,在内存中(堆区)加载字节流生成一个Class对象,在JVM中唯一实体。的静态方法或字段,会触发初始化阶段。原创 2024-10-18 17:30:00 · 1420 阅读 · 0 评论 -
JVM标量替换
JVM 中的标量替换是一种编译优化技术,将未逃逸对象拆解成不能再分,标量在栈帧或寄存器中分配使用。将对象拆解后直接使用标量,不但避免了完整对象的创建和后续回收流程,而且能更快地获取和操作相应的数据,提升了程序的执行效率。原创 2024-11-24 17:40:15 · 1305 阅读 · 0 评论