
jvm
文章平均质量分 62
王佑辉
个人笔记,多谢指正,不喜勿喷
展开
-
【jvm】GC评估指标
1.在Java虚拟机(JVM)中,垃圾回收(Garbage Collection, GC)是管理内存、自动回收不再使用的对象的关键机制。根据应用的特点(如延迟敏感型、吞吐量优先型),选择合适的GC算法,如G1、ZGC、Shenandoah等。1.定义:从年轻代晋升到老年代的对象数量与年轻代分配的对象数量的比率。调整堆大小、新生代与老年代的比例、GC线程数等参数,以优化GC性能。堆内存使用:年轻代、老年代等各区域的内存使用情况。1.定义:GC回收的内存量与分配的内存量的比率。原创 2025-04-04 22:07:38 · 756 阅读 · 0 评论 -
【jvm】强软弱虚引用的区别
1.最常见的引用类型,通常我们直接创建的对象引用就是强引用。2.只要某个对象存在强引用,垃圾回收器(GC)就不会回收该对象。1.软引用用于描述一些还有用但并非必须的对象。2.对于只有软引用的对象,在系统将要发生内存溢出异常之前,会把这些对象列入回收范围进行二次回收。1.弱引用也是用来描述非必须对象的,但它的强度比软引用更弱。2.被弱引用关联的对象只能存活到下一次垃圾回收之前,当垃圾回收器工作时,无论内存是否充足,都会回收掉只被弱引用关联的对象。原创 2025-04-02 21:11:43 · 1013 阅读 · 0 评论 -
【jvm】安全点
1.安全点是JVM代码中的特定位置,所有线程在此处的状态是已知且一致的。2.JVM通过安全点暂停应用线程,保证以下操作的原子性。3.垃圾回收:暂停线程以扫描堆内存中的对象引用,避免引用关系变化导致回收错误。4.类重新定义/卸载:确保类结构修改时线程状态可控。5.监控与调试:获取线程栈信息或设置断点。6.其他管理操作:如动态代码优化、性能统计。原创 2025-03-31 20:48:30 · 419 阅读 · 0 评论 -
【jvm】垃圾回收的并行和并发
1.并行描述的是多条垃圾收集器线程之间的关系,指的是垃圾回收线程在执行垃圾回收任务时,会同时启动多个线程协同工作,以提高垃圾回收的效率。1.并发描述的是垃圾收集器线程与用户线程之间的关系,指的是垃圾回收线程与用户线程在同一时间段内可以同时运行,即垃圾回收线程在执行垃圾回收任务时,用户线程仍然可以继续执行。原创 2025-03-24 19:16:31 · 522 阅读 · 0 评论 -
【jvm】java存在内存溢出吗
2.在Java 8及以后,虽然没有了永久代,取而代之的是元空间(Metaspace),但如果应用程序加载了大量的类,或者有内存泄漏导致类的元数据不断增加,也会出现元空间内存溢出。1.在Java 7及以前版本,存在永久代(PermGen),如果在程序中加载了大量的类,或者有动态生成类(如使用CGLIB等字节码增强技术)的情况,可能会导致永久代内存溢出。3.使用内存分析工具:如Eclipse Memory Analyzer,来分析内存中的对象,找出占用大量内存的对象,然后对其进行优化。原创 2024-12-25 19:18:39 · 441 阅读 · 0 评论 -
【jvm】内存泄漏与内存溢出的区别
2.在程序运行时,无用的对象仍然被保留在内存中,导致内存占用不断增加,最终耗尽可用内存。3.内存泄漏是指程序中存在某些对象无法被垃圾收集器回收,因为这些对象仍然被引用,但实际上这些引用已经不再被使用。这种情况会导致内存持续占用,随着时间的推移逐渐耗尽可用内存。原创 2024-12-24 19:32:19 · 698 阅读 · 0 评论 -
【jvm】内存泄漏的8种情况
1.如果一个外部类的实例对象的方法返回了一个内部类的实例对象,这个内部类对象被长期引用了,即使外部类实例对象不再被使用,但由于内部类持有外部类的实例对象,外部类对象也不会被垃圾回收,这也会造成内存泄漏。1.在使用HashSet等基于哈希值的数据结构时,如果对象的哈希值在添加到集合后被改变(例如,修改了对象的某个字段,该字段参与哈希值的计算),那么将导致无法从集合中正确删除该对象,从而造成内存泄漏。2.如果单例对象持有外部对象的引用,那么这个外部对象也不会被回收,从而造成内存泄漏。原创 2024-12-23 19:53:21 · 1433 阅读 · 0 评论 -
【jvm】内存溢出内存不够的原因
2.文件句柄限制:系统对文件句柄的使用是有限制的,如果应用程序使用的文件句柄超过了这个限制,也可能导致内存溢出或相关错误(虽然这通常与内存泄漏或内存不足的直接表现不同,但也可能影响JVM的内存管理)。3.永久代/元空间不足(针对Java 7及以前版本中的永久代,Java 8及以后版本使用元空间):加载的类过多,或者类的元数据占用的内存过大,导致永久代/元空间不足。1.堆内存设置过小:JVM启动参数中的-Xms(初始堆大小)和-Xmx(最大堆大小)设置过小,无法满足应用程序的内存需求。原创 2024-12-12 22:17:15 · 509 阅读 · 0 评论 -
【jvm】GC Roots有哪些
2.JNI允许Java代码与本地代码进行交互,本地方法中的局部变量和参数可能持有对Java对象的引用,这些引用也是GC Roots的一部分。1.JVM可能会为某些特殊目的而保留一些对象,这些对象虽然不直接由用户代码持有,但JVM认为它们是重要的,因此也被视为GC Roots。1.正在执行的线程被视为GC Roots,因为它们持有当前执行状态的信息,包括线程栈中的局部变量和参数,这些可能引用堆中的对象。2.这些GC Roots对象能够直接或间接持有其他对象的引用,从而确保从它们出发可以遍历到所有存活的对象。原创 2024-12-11 19:31:38 · 1033 阅读 · 0 评论 -
【jvm】垃圾判别阶段算法
虚拟机栈(栈帧中的本地变量表)中引用的对象、方法区中类静态属性引用的对象、方法区中常量引用的对象、本地方法栈中JNI(Native方法)引用的对象等。:为了进行垃圾判别和回收,JVM需要暂停所有的应用线程,以防止在垃圾回收过程中对象的状态发生变化。当计数器的值为0时,表示该对象不再被引用,可以被回收。:无法解决循环引用问题,即两个或多个对象相互引用,导致它们的引用计数器都不为0,从而无法被回收。:在标记完存活对象后,JVM会清除所有未被标记的对象。这些对象被视为垃圾对象,其占用的内存空间将被回收。原创 2024-12-09 19:46:45 · 447 阅读 · 0 评论 -
【jvm】垃圾回收的重点区域
堆是JVM用于存储对象实例的内存区域,也是垃圾回收的主要目标区域。2.原创 2024-12-07 11:41:44 · 492 阅读 · 0 评论 -
【jvm】垃圾回收的优点和原理
1.JVM(Java虚拟机)垃圾回收是Java语言的一大特性,它自动管理内存,减轻了程序员的负担,并提高了程序的稳定性和安全性。:JVM垃圾回收机制能够自动回收不再使用的对象所占用的内存,无需程序员手动释放内存,从而避免了内存泄漏和悬挂指针等问题。2.当这个区域的内存用完时,垃圾收集器会将存活的对象复制到另一个区域,并清空已使用的区域。:垃圾回收机制能够回收不再使用的内存,并将其重新分配给新的对象,从而优化了内存的使用。1.该算法首先标记出所有可达的对象,然后清除未标记的对象所占用的内存。原创 2024-12-07 11:24:22 · 677 阅读 · 0 评论 -
【jvm】为什么要有GC
1.虽然GC机制会引入一定的性能开销,但JVM通过不断优化的GC算法和回收器,能够在保证内存管理正确性的同时,尽量降低对程序性能的影响。1.JVM中的GC机制还采用了分代回收策略,将内存划分为不同的代(如年轻代和老年代),并根据对象的生命周期长短采用不同的回收策略。2.GC机制通过自动回收不再使用的对象所占用的内存,减少了内存泄漏和内存碎片化的可能性,从而提升了程序的稳定性和可靠性。2.GC机制还可以根据程序的运行情况和内存需求,动态调整堆内存的大小和回收策略,从而进一步优化性能。原创 2024-12-07 11:09:33 · 599 阅读 · 0 评论 -
【jvm】什么是垃圾
10.JVM提供了垃圾回收机制来自动管理内存,但程序员仍然需要注意一些内存管理相关的最佳实践,比如避免创建过多的临时对象、重用对象、使用对象池等,以减少垃圾回收的频率和开销。5.标记阶段:垃圾回收器会遍历所有可达的对象(即从根集合开始,通过引用链可以访问到的所有对象),并标记它们为存活对象。6.清除阶段:在标记阶段之后,垃圾回收器会扫描堆内存中的所有对象,并回收那些未被标记为存活对象的内存空间。4.JVM使用垃圾回收机制来自动管理内存,包括识别哪些对象是垃圾以及何时回收它们所占用的内存。原创 2024-12-03 19:35:58 · 370 阅读 · 0 评论 -
【jvm】讲讲jvm中的gc
1.JVM(Java Virtual Machine)中的GC(Garbage Collection)是Java虚拟机提供的一种自动内存管理机制,用于自动回收不再被使用的对象所占用的内存空间。2.后续步骤不是直接对可回收对象进行回收,而是让所有存活的对象都向内存的一端移动,然后直接清理掉端边线以外的内存。2.当一块内存用完了,触发GC时,将该块中存活的对象复制到另一块内存区域,然后一次性清理掉这块没有用的内存。1.选择合适的GC算法和回收器:根据应用程序的性质和需求,选择适合的GC算法和回收器。原创 2024-12-03 19:31:22 · 827 阅读 · 0 评论 -
【jvm】C1编译器和C2编译器的区别
1.JVM(Java虚拟机)中的C1编译器和C2编译器是两种不同的即时编译器(JIT Compiler),它们各自具有独特的特点和适用场景。1.C1编译器:由于编译速度快且生成的代码相对较小,因此启动性能较好。2.C2编译器:虽然编译速度慢且生成的代码较大,但长期运行时的性能优越。2.在分层编译中,整个优化过程被划分为多个层次,每个层次对应不同的编译策略和优化级别。3.C1编译器通常负责前几个层次的编译任务,进行简单的优化。1.编译速度慢,但生成的代码质量高,执行效率高。3.优化程度较高,注重全局优化。原创 2024-11-29 21:35:41 · 697 阅读 · 0 评论 -
【jvm】C2编译器
在分层编译模式下,JVM会首先使用C1编译器编译热点代码以快速达到本机代码性能,随后在有更多分析信息可用时,使用C2编译器进行更深入的优化。例如,可以使用-XX:+UseServerCompiler参数来启用C2编译器(尽管在Java 8及更高版本中,这个参数通常不是必需的,因为C2编译器已经是默认启用的)。与C1编译器相比,C2观察和分析代码的时间更长,这使得C2能够对编译后的代码进行更好的优化。4.设置编译代码:最后,C2编译器会将生成的本地机器代码设置为编译后的代码,以便在运行时执行。原创 2024-11-29 20:28:34 · 776 阅读 · 0 评论 -
【jvm】C1编译器
在优化完成后,C1编译器会将高级中间表示(HIR)转换为低级中间表示(LIR),然后基于LIR进行寄存器分配和机器代码生成。:C1编译器会对代码进行一些基本的优化,如条件表达式消除、基本块消除、全局值编号(GVN)优化、数组范围检查消除和NULL检查消除等。:在生成HIR后,C1编译器会对其进行一系列优化,如条件表达式消除、基本块消除、GVN优化、数组范围检查消除和NULL检查消除等。2.在运行时,JVM会动态地将经常执行的字节码编译为本地机器代码,这个过程包括对代码进行优化,以提高执行速度。原创 2024-11-29 20:13:34 · 708 阅读 · 0 评论 -
【jvm】什么是动态编译
在动态编译后,通常需要使用自定义的类加载器来加载生成的字节码。这是因为默认的类加载器通常只加载已经存在于文件系统中的类。原创 2024-11-28 22:30:19 · 459 阅读 · 0 评论 -
【jvm】AOT编译器
1.JVM(Java虚拟机)中的AOT(Ahead Of Time)编译器是一种静态提前编译器,它在程序运行之前将Java字节码转换为机器码。2.基本概念:AOT编译指的是在程序运行之前,便将字节码转换为机器码的过程。:AOT编译器借助Graal编译器(或其他底层编译器技术),将输入的Java类文件转换为机器码,并存放至生成的动态共享库之中。2.限制:由于AOT编译器需要为每个不同的硬件和操作系统编译对应的发行包,因此其灵活性和可移植性受到一定限制。必须为每个不同的硬件和操作系统编译对应的发行包。原创 2024-11-24 15:38:58 · 603 阅读 · 0 评论 -
【jvm】为什么java是半编译半解释型语言
3.与C/C++编译器不同,Java编译器不会将源代码直接编译成特定硬件平台的机器码,而是生成一种可以在任何支持Java的平台上运行的中间代码。1.跨平台性:由于Java源代码被编译成与平台无关的字节码,因此可以在任何支持Java的平台上运行,无需重新编译。3.安全性:Java的字节码和JVM的安全机制提供了强大的安全保障,可以防止恶意代码的执行和内存泄露等问题。4.与纯解释型语言不同的是,Java的解释器解释的是预编译的字节码,而不是源代码本身。1.生成的字节码需要在Java虚拟机(JVM)上运行。原创 2024-11-24 14:55:21 · 555 阅读 · 0 评论 -
【jvm】解释器
这得益于JVM的跨平台特性,它屏蔽了与具体操作系统平台相关的信息,使得Java程序只需要生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。:JVM解释器是一种逐条解释和执行字节码指令的方式,这意味着每次执行都需要对字节码进行解析和转换,相对于直接编译为本地机器码来说,解释执行的速度可能会慢一些。2.解释器会缓存已经翻译过的字节码指令和对应的机器码,以便在后续执行时能够直接调用缓存的机器码,而无需再次进行解析和转换。:将字节码解析为相应的指令,每条指令对应JVM中的一个操作。原创 2024-11-24 14:41:32 · 543 阅读 · 0 评论 -
【jvm】执行引擎是做什么
即时编译器的目的是将热点代码(即被频繁调用的代码)整个编译成机器码,以便在每次函数执行时直接执行编译后的机器码,从而大幅度提升执行效率。此外,JVM还会对热点代码进行深度优化,以提高其执行效率。:执行引擎能够读取并解析由Java编译器生成的字节码文件(.class文件),这些字节码文件包含了JVM能够识别并执行的指令。:根据程序计数器(PC寄存器)中保存的当前字节码指令的地址,执行引擎能够逐条执行字节码指令,并得到执行结果。1.执行引擎是JVM中的核心组件之一,它决定了Java程序的执行效率和性能。原创 2024-11-24 14:19:48 · 422 阅读 · 0 评论 -
【jvm】java对象的访问定位
1.在使用句柄的访问方式中,Java堆会被划分为两部分:一部分用于存放对象实例数据,另一部分则用于存放对象实例数据的地址(或称为句柄2.在Java虚拟机中,引用(reference)实际上是指向句柄的引用,而不是直接指向对象的引用。1.在使用直接指针的访问方式中,对象实例数据直接存放在Java堆中,而引用则直接指向对象实例数据的地址。原创 2024-11-24 13:51:35 · 551 阅读 · 0 评论 -
【jvm】java对象头
它包含了类的元数据,如类的方法、字段、父类、接口等。b.数组对象:在64位JVM中,对象头通常是16字节(Mark Word占8字节,类元数据指针占4字节,数组长度占4字节)。a.普通对象(非数组):在64位JVM中,对象头通常是12字节(Mark Word占8字节,类元数据指针占4字节)。5.类元数据指针:指向对象所属类的元数据信息(在Java 8及以后,元数据的存储由方法区中的类型信息指针指向)。1.对象头的大小并不是固定的,它依赖于JVM的实现和具体的平台(如32位或64位系统)。原创 2024-11-24 13:37:29 · 563 阅读 · 0 评论 -
【jvm】对象的内存布局
1.并不是每个对象都有这部分,但JVM可能会在对象的末尾添加一些填充字节(Padding Bytes),以确保对象的大小是某个字节的倍数(通常是8字节)。2.对象的内存布局在JVM内部进行优化,以提高性能。1.对象的实际内存布局和大小可能受到JVM实现、JVM参数(如是否启用压缩指针)、操作系统、硬件架构等多种因素的影响。3.使用JVM提供的工具(如jmap、jhat、VisualVM等)可以帮助分析对象的内存使用情况。1.存储对象的字段(Field)信息,包括从父类继承的字段和自己定义的字段。原创 2024-11-23 21:28:53 · 620 阅读 · 0 评论 -
【jvm】new对象的过程
如果堆内存中的内存并不是规整的,已被使用的内存和空闲的内存相互交错在一起,JVM就必须维护一个列表,记录上哪些内存块是可用的。:如果堆内存是绝对规整的,所有被使用过的内存都被放在一边,空闲的内存被放在另一边,中间放着一个指针作为分界点的指示器。基本类型的实例变量会被初始化为对应类型的零值(例如,整型为0,布尔型为false),而引用类型的实例变量会被初始化为null。1.在Java中,使用new关键字创建对象的过程是一个复杂而精细的过程,它涉及多个步骤,包括类加载、内存分配、初始化等。原创 2024-11-23 15:36:22 · 692 阅读 · 0 评论 -
【jvm】从字节码角度看待对象创建流程
(Bump the Pointer):如果堆内存是规整的(即没有内存碎片),JVM会通过一个指针来跟踪当前已分配的内存位置,并将指针向前移动一段空间来为新对象分配内存。1.在分配内存之后,JVM会将分配的内存空间初始化为零值(即所有的基本数据类型都被初始化为默认值,如int为0,boolean为false等)。(Free List):如果堆内存是不规整的,JVM会维护一个空闲列表来记录哪些内存块是可用的,然后从中选择一个合适的内存块为新对象分配内存。1.最后一步是调用对象的构造函数来初始化对象的成员变量。原创 2024-11-23 13:52:52 · 719 阅读 · 0 评论 -
【jvm】方法区是否存在GC
6.在Hotspot虚拟机中,方法区对应的是持久代(PermGen space,在JDK 8及之后被元空间Metaspace取代),尽管持久代上的GC较少,但并不代表完全没有。2.在JVM(Java虚拟机)中,方法区是一个所有线程共享的内存区域,用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。9.因为方法区的垃圾回收相对复杂,且对性能有一定影响,所以JVM通常会尽量避免频繁的方法区GC。4.方法区的垃圾回收主要针对的是常量池的回收和已加载类的卸载。原创 2024-11-17 15:19:52 · 466 阅读 · 0 评论 -
【jvm】StringTable为什么要调整
然而,永久代的内存空间相对较小,随着应用程序的运行,大量字符串的创建和存储可能导致永久代内存不足,进而引发内存溢出(OOM)异常。1.性能优化:将StringTable调整到堆中后,可以通过调整堆内存的大小和垃圾回收策略来优化应用程序的性能。由于Full GC的代价较高,且回收时机不灵活,这导致StringTable中的字符串对象难以及时被回收,进一步加剧了内存压力。通过调整堆内存的大小和垃圾回收策略,可以实现对StringTable中字符串对象的及时回收,从而提高内存利用率和应用程序的性能。原创 2024-11-17 15:00:02 · 642 阅读 · 0 评论 -
【jvm】方法区常用参数有哪些
2.该参数在JVM的某些版本中可能已经被废弃,例如在Java 8及以后的版本中,元空间(Metaspace)取代了永久代,此时应使用-XX:MetaspaceSize来设置初始大小。2.在Java 8及以后的版本中,应使用-XX:MaxMetaspaceSize来设置元空间的最大容量。2.Java 8及以后的版本使用元空间来取代永久代,用于存储类的元数据。2.这个参数可以用于跟踪类的加载过程,帮助开发者了解类的加载情况。1.设置JVM允许分配的元空间的最大容量。1.设置JVM初始分配的元空间大小。原创 2024-11-17 14:40:09 · 408 阅读 · 0 评论 -
【jvm】方法区的理解
当大量加载类时,不用担心方法区溢出。1.类型信息:存储每个加载的类(Class)、接口(interface)、枚举(enum)、注解(annotation)的类型信息,包括类型的完整有效名称、直接父类的完整有效名称、直接接口的序列集以及类型的修饰符。4.运行时常量池:方法区的一部分,用于存储编译期生成的各种字面量和符号引用,包括字符串、数字、类和方法的符号引用等。3.方法信息:存储方法的相关信息,包括方法名、方法返回类型、方法的参数的数量和类型、方法的字节码、方法的修饰符以及方法的异常表。原创 2024-11-17 14:20:42 · 623 阅读 · 0 评论 -
【jvm】HotSpot中方法区的演进
4.内存管理:元空间的内存管理相对简单,当元空间不足时,可以通过增加本地内存或优化类的加载和卸载来解决问题。2.元空间:元空间是一个与堆不相连的本地内存区域,用于存储类的元数据信息(如类型信息、字段、方法等)。3.优势:元空间的引入解决了永久代内存管理困难的问题,提高了内存使用的灵活性和效率。1.完全移除永久代:在JDK1.8中,永久代被完全移除,取而代之的是元空间(Metaspace)。4.通过移除永久代并引入元空间,虚拟机提高了内存使用的灵活性和效率,同时降低了内存管理的复杂性。原创 2024-11-17 13:43:35 · 552 阅读 · 0 评论 -
【jvm】如何破坏双亲委派机制
1.在Tomcat等容器中,每个Web应用都有自己的类加载器。2.这些类加载器通常是通过继承ClassLoader类并重写其方法来实现的。3.通过这种方式,Tomcat等容器可以实现应用之间的类隔离,并打破双亲委派模型。原创 2024-11-16 19:12:49 · 864 阅读 · 0 评论 -
【jvm】为什么要用元空间替代永久代
元空间的实现采用了更高效的数据结构和算法,例如使用指针碰撞(Bump the Pointer)的方式分配内存,这有助于减少内存碎片化,提高内存分配的效率。此外,元空间还支持并发的类加载和卸载操作,进一步提高了JVM的性能。而在元空间模型中,由于字符串常量池已移至堆中,静态变量也移至Java堆或者本地内存,因此可以更有效地进行垃圾回收,避免了因频繁的Full GC导致的性能影响。1.在永久代中,类的卸载机制相对复杂,难以实现完全的类卸载,这可能导致内存无法被有效释放,从而引发内存泄漏问题。原创 2024-11-16 11:39:55 · 1083 阅读 · 0 评论 -
【jvm】一个空Object对象的占多大空间
这些信息被官方称为“Mark Word”。3.在64位操作系统上,且未开启指针压缩的情况下,一个空Object对象通常占用16字节(对象头,包括Mark Word和类元指针)+ 0字节(实例数据)+ 0字节或更多(对齐填充,但16字节已经是8的倍数,所以不需要额外填充)= 16字节。1.在64位操作系统上,且开启了指针压缩(UseCompressedOops)的情况下,一个空Object对象通常占用12字节(对象头)+ 0字节(实例数据)+ 4字节(对齐填充,使总大小达到16字节的倍数)= 16字节。原创 2024-11-16 10:57:45 · 627 阅读 · 0 评论 -
【jvm】分代年龄为什么是15次
Survivor区内部又分为From区和To区,刚从伊甸园区转移过来的对象会分配到From区。每经历一次Young GC,这些无法被回收的对象就会在From区和To区来回移动,每移动一次,这个对象的GC年龄就加1。1.在JVM的堆(Heap)内存里面,主要分为三个部分:伊甸园区(Eden Space)、Survivor区(包括From区和To区)、老年代(Old Generation)。4.老年代:当对象的GC年龄达到某个阈值时(默认为15),或者满足动态年龄判断的依据时,该对象会被转移到老年代。原创 2024-11-16 10:42:10 · 453 阅读 · 0 评论 -
【jvm】G1垃圾收集器的特点,为什么低延迟
3.这些机制使得G1能够在不停止整个应用程序的情况下进行垃圾回收,并且根据用户指定的暂停时间来调整回收策略,从而最大程度地减少应用程序的停顿时间。1.G1除了追求低停顿外,还能建立可预测的停顿时间模型,能让使用者明确指定在一个长度为M毫秒的时间片段内,消耗在垃圾收集上的时间不得超过N毫秒。2.这种区域化的管理方式使得G1可以只回收部分区域,而不需要停止整个应用程序的执行,从而降低了应用程序的停顿时间。2.它会根据应用程序的负载情况和垃圾回收的需求来动态调整回收的区域数量和回收的时间。原创 2024-11-16 10:37:11 · 759 阅读 · 0 评论 -
【jvm】如何判断一个对象是否可以回收
虚引用的存在主要用于跟踪对象被垃圾回收的状态,可以在对象被回收后执行一些清理操作。2.它从一组称为GC Roots的根对象开始,通过递归方式遍历引用图,判断哪些对象是可达的,哪些是不可达的。3.清除阶段:在标记完成后,JVM遍历堆中的所有对象,将未被标记的对象视为垃圾,清除这些对象所占用的内存。1.在进行可达性分析时,JVM还考虑了不同的引用类型,这些引用类型决定了对象的可达性及其回收时机。:强引用是Java中的默认引用类型。3.当计数器的值为0时,表示该对象没有被任何对象引用,因此可以被回收。原创 2024-11-14 17:40:45 · 886 阅读 · 0 评论 -
【jvm】双亲委派机制
2.避免重复加载:通过双亲委派机制,如果一个类已经被一个类加载器加载过,那么其他的类加载器就无需再次尝试加载,这样可以避免同一个类被多次加载的情况,节省内存并提高性能。2.双亲委派机制的基本思想是:当一个类加载器试图加载某个类时,它会先委托给其父类加载器,如果父类加载器无法加载,再由当前类加载器自己进行加载。它的父类加载器是扩展类加载器。2.委派父加载器:如果没有加载过该类,类加载器将加载请求委派给父类加载器。4.启动类加载器加载:启动类加载器尝试加载类,如果加载成功,则返回该类。原创 2024-11-14 17:08:00 · 671 阅读 · 0 评论