![](https://img-blog.csdnimg.cn/direct/2405005231184bb3b499a5863711dd0a.jpeg?x-oss-process=image/resize,m_fixed,h_224,w_224)
JVM
JVM学习记录
Longer_Wish_C
这个作者很懒,什么都没留下…
展开
-
CMS垃圾回收过程中重新标记阶段为什么不能清理浮动垃圾
至于 “浮动垃圾”,因为 CMS 在 并发标记 时是并发的,GC 线程和用户线程并发执行,这个过程当然可能会因为线程的交替执行而导致新产生的垃圾(即浮动垃圾)没有被标记到;而 重新标记 的作用只是修改之前 并发标记 所获得的。因为在并发标记时,因为是 GC 和用户线程是并发执行的,可能导致一部分已经标记为 从 GC Roots 不可达 的对象,若该对象在用户线程的修改下又可达了,Remark 的作用就是将这部分对象又标记为 可达对象(漏标)。,所以是没有办法处理 “浮动垃圾” 的。不可达对象为可达的对象。原创 2024-06-28 20:05:56 · 205 阅读 · 0 评论 -
happens-before 关系
程序顺序规则: 在同一个线程中,代码 x = 1;中的 x = 1 操作 happens-before y = 2 操作。监视器锁规则: 一个线程获取了锁,执行了一些操作,然后释放了锁,另一个线程获取了同一个锁,那么释放锁的操作 happens-before。volatile 变量规则: 一个线程将一个 volatile 变量的值修改为 1,另一个线程读取该变量的值,那么写操作。它定义了哪些操作必须在哪些操作之前执行,从而避免了数据竞争和不一致性问题。happens-before 读操作。原创 2024-06-14 09:42:03 · 580 阅读 · 0 评论 -
元空间和方法区有什么不同
元空间并不在虚拟机内存中,而是使用本地内存(即操作系统的内存)。元空间不再有字符串常量池和类静态变量池,这些内容被移到了堆中。● 类的结构信息、方法信息。原创 2024-05-19 21:23:34 · 137 阅读 · 0 评论 -
Java类加载过程
加载是一个读取class文件,通过【类加载器】将class文件装载到jvm中的方法区内,并在JVM堆中生成一个便于用户调用的java.lang.Class类型的对象的过程。对class的成员变量、静态变量、静态代码块的赋值,如果有【实例化对象】,则会调用方法对实例变量进行初始化,并执行对应的构造方法内的代码。类加载主要分为以下五个阶段。原创 2024-05-19 21:12:31 · 199 阅读 · 0 评论 -
常量池和运行时常量池以及字符串常量池的区别
运行时常量池在类加载后被创建,它包括了类在编译期间静态生成的所有常量,以及运行期间动态生成的常量。运行时常量池具有动态性,不仅包括编译器编译的数据,还可能在运行时将新的常量放入池中,如String类的intern()方法。运行时常量池是常量池的运行时表示,属于方法区的一部分。每个加载到JVM的类或接口都有一个运行时常量池,用于存储编译期生成的各种字面量和符号引用的动态副本。如果不存在,新的字符串将被创建并放入池中。常量池是Java编译器生成的,存储在.class文件中的数据集合,它包含了类中所有的。原创 2024-05-10 10:09:17 · 300 阅读 · 0 评论