
jvm
文章平均质量分 53
jvm
Shen_Li_Java_ing
加电!加电!!加电!!!
展开
-
说一说强、软、弱、虚引用
唯一作用就是配合引用队列来监控引用的对象是否被加入到引用队列中,也就是可以准确的让我们知晓对象何时被回收。,也就是说在JVM抛出OutOfMemoryError之前,会去清理软引用对象,适合用在内存敏感的场景。,ThreadLocal中的 key 就用到了弱引用,适合用在内存敏感的场景。Java根据其生命周期的长短将引用类型又分为强引用、软引用、弱引用、虚引用。虚引用:如果一个对象仅持有虚引用,它就和没有任何引用一样,强引用:就是我们平时 new一个对象的引用。弱引用:比软引用还短,在GC的时候,原创 2024-06-24 20:58:20 · 380 阅读 · 0 评论 -
类加载机制
总体来说,Java程序的启动涉及了类加载、链接、初始化等多个步骤。当你运行Java程序时,Java虚拟机(JVM)会加载字节码文件。JVM通过类加载器(Class Loader)来加载字节码文件,将其转换为运行时的Java类。JVM会在加载和初始化完主类后寻找main方法,main方法是Java程序的入口点。一旦main方法被找到,JVM会执行main方法中的代码,从而启动Java程序的执行。在链接阶段,JVM将加载的类与它们引用的其他类和库进行链接。编译成功后,将在相同的目录中生成字节码文件。原创 2024-06-24 20:55:56 · 432 阅读 · 0 评论 -
什么是PLAB?
先从老年代 freelist(空闲链表)申请一块空间,然后在这一块空间中就可以通过指针加法(bump thepointer)来分配内存,这样对freelist竞争也少了,分配空间也快了。可以看到和TLAB很像,PLAB即 Promotion Local Allocation Buffers。大致就是上图这么个思想,每个线程先申请一块作为PLAB,然后在这一块内存里面分配晋升的对象。在多线程并行执行YGC时,可能有很多对象需要晋升到老年代,此时老年代的指针就"热"起来了,于是搞了个PLAB。原创 2024-06-01 21:31:40 · 741 阅读 · 0 评论 -
什么是TLAB?
在HotSpot 中会生成一个填充对象来填满这一块,因为堆需要线性遍历,遍历的流程是通过对象头得知对象的大小,然后跳过这个大小就能找到下一个对象,所以不能有空洞。TLAB的思想其实很简单,就是划一块区域给一个线程,这样每个线程只需要在自己的那亩地申请对象内存,不需要争抢热点指针。一般而言生成对象需要向堆中的新生代申请内存空间,而堆又是全局共享的,像新生代内存又是规整的,是通过一个指针来划分的。可以看到TLAB内部只剩一格大小,申请的对象需要两格,这时候需要再申请一块TLAB,之前的那一格就浪费了。原创 2024-06-01 21:30:12 · 316 阅读 · 0 评论 -
JVM哪些区域可能出现内存溢出,哪些地方需要GC?
需要GC:方法区在Java 8之后使用Metaspace取代了永久代,它具有更灵活的内存管理机制,不再有永久代的限制。- 可能出现内存溢出:栈用于存储**线程的方法调用**和**局部变量**,当栈空间不足时可能导致栈溢出。,所以思考一下,沿着之前提到过的JVM内存分区,堆,栈,程序计数器,方法区。* 可能出现内存溢出:堆是存储对象实例的区域,当创建的对象数量超过堆的容量时,就会导致堆内存溢出。- GC:程序计数器不涉及垃圾回收。- GC:主要的垃圾回收工作发生在堆中,回收无用的对象,释放内存空间。原创 2024-05-31 21:51:48 · 711 阅读 · 0 评论 -
CMS清理流程及问题
CMS(Concurrent Mark Sweep,并发标记清除)收集器是以获取最短回收停顿时间为目标的收集器(追求低停顿),它在垃圾收集时使得用户线程和GC线程并发执行,因此在垃圾收集过程中用户也不会感到明显的卡顿。在CMS的并发标记和并发清理阶段,用户线程还在继续运行,就还会伴随有新的垃圾对象不断产生,但这一部分垃圾对象是出现在标记过程结束以后,CMS无法在当次收集中处理掉它们,只好留到下一次垃圾收集时再清理掉。因为第2步并没有阻塞其它工作线程,其它线程在标识过程中,很有可能会产生新的垃圾。原创 2024-05-06 20:14:24 · 688 阅读 · 0 评论 -
CMS和G1为了维持并发的正确性分别用了什么手段?
在我们这个例子中,在并发标记阶段,A是一个黑色对象,F是一个白色对象,A引用了F,这个引用关系会被记录下来,然后通过这个记录在重新标记阶段再从A对象开始枚举一次,保证如果A还是保持着F的引用,那么F会被正确标记;正常情况下,一个对象如果是黑色,那么其直接引用的对象要么是黑色,要么是灰色,不可能是白色(如果出现黑色对象直接引用白色对象的情况,就说明漏标了,就会导致对象误删,后面会介绍如何解决),这个特性也可以说是三色标记算法正确性保障的前提条件。如果取出的这个灰色对象没有直接引用,那么直接变成黑色。原创 2024-05-06 20:12:54 · 1208 阅读 · 0 评论 -
内存溢出和内存泄漏
内存泄漏︰是指你向系统申请分配内存进行使用(new),可是使用完了以后却不归还(delete),结果你申请到的那块内存你自己也不能再访问(也许你把它的地址给弄丢了),而系统也不能再次将它分配给需要的程序。就相当于你租了个带钥匙的柜子,你存完东西之后把柜子锁上之后,把钥匙丢了或者没有将钥匙还回去,那么结果就是这个柜子将无法供给任何人使用,也无法被垃圾回收器回收,因为找不到他的任何信息。内存溢出:就是你要的内存空间超过了系统实际分配给你的空间,此时系统相当于没法满足你的需求,就会报内存溢出的错误。原创 2024-04-19 19:55:53 · 251 阅读 · 1 评论 -
常见的几种垃圾回收器
它使用标记-复制算法,但允许多个线程并行执行垃圾回收操作,以提高吞吐量。它使用分代收集,但将年轻代和老年代划分为不同的区域,使用标记-整理算法,以更好地控制垃圾回收的停顿时间和内存利用率。G1 Garbage Collector (G1GC):在G1GC中,老年代的垃圾回收也使用标记-整理算法,与年轻代的处理方式相似。它使用标记-复制算法。,JVM有很多垃圾回收器,它们实现了不同的垃圾回收算法,可以用在不同jdk版本,也适配不同的区域,比如青年代老年代都有各自专属的垃圾回收器。,对应JAVA中的接口,原创 2024-04-17 21:54:36 · 705 阅读 · 1 评论 -
浅聊一下双亲委派机制
c.如果父类加载器可以完成类加载任务,就成功返回,倘若父类加载器无法完成此加载任务,子加载器才会尝试自己去加载,这就是双亲委派机制。类加载器在加载的时候都会优先交给上层去加载,如果没有上级或者上级不能加载的时候才会交给自身去加载。a. 如果一个类加载器收到了类加载请求,它并不会自己先去加载,而是把这个请求委托给父类的加载器去执行。b.如果父类的加载器还存在其父类加载器,则进一步向上委托,依次递归请求最终达到顶层的启动类加载器。a.启动类加载器:负责加载 java_home\lib目录下的类,比如。原创 2024-04-16 21:21:12 · 385 阅读 · 0 评论