![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
JVM
文章平均质量分 76
JVM
逐渐呆滞
黑奴
展开
-
对象分配策略
首先进入新生代的Eden区,此后要么是朝生夕死的对象,在某次Minor GC中被回收,要么在新生代中熬过15次Minor GC(默认晋级老年代的分代年龄阈值为15),当对象进入老年代后,就很难轻易被回收了。当然,总有对象死亡的一天,只是时间问题罢了。总体的流程就是这样,但细心的人会发现,文字所描述的过程跟图上有所差别,这里就不得不提一下JVM的动态对象年龄判定,和空间分配担保了。但在我们编码过程中,肯定不是所有的对象都会一直生存到最后,也会有一些特殊情况,而虚拟机也考虑到各种情况,也对其做出了应对。原创 2023-02-26 10:03:59 · 509 阅读 · 2 评论 -
CMS垃圾回收器
上述四个步骤中,初始标记和重新标记两个步骤会“Stop The Word”,也就是会暂停用户线程,如下图。CMS 的并发标记和并发清理阶段, 用户线程是还在继续运行的, 程序在运行自然就还会伴随有新。CMS无法处理浮动垃圾,CMS和用户线程并发运行期间预留的内存不够新对象分配,导致并发失败。的垃圾对象不断产生, 但这一部分垃圾对象是出现在标记过程结束以后,只能下次垃圾回收处理。并行:指多条垃圾收集器线程并行工作,此时用户线程处于等待状态。并发:指用户线程和垃圾回收线程同时工作(也可以交替工作)原创 2023-02-19 09:52:41 · 457 阅读 · 0 评论 -
对象的内存布局
HotSpot VM使用oop描述对象,oop字面意思是“普通对象指针”。它是指向一片内存的指针,只是将这片内存‘视作’(强制类型转换)Java对象/数组。对象的本质就是用对象头和字段数据填充这片内存。原创 2023-02-05 13:30:54 · 153 阅读 · 0 评论 -
String的不可变性
如果一个对象在创建之后就不能再改变它的状态,那么这个对象是不可变的(Immutable)。不能改变状态的意思是,不能改变对象内的成员变量,包括基本数据类型变量的值不能改变,引用类型的变量不能指向其他的对象,引用类型指向的对象的状态也不能改变。原创 2023-01-15 14:37:04 · 333 阅读 · 0 评论 -
JVM方法区的内部结构
而Java 中的字节码需要数据支持,通常这种数据会很大以至于不能直接存到字节码里,换另一种方式,可以存到常量池,这个字节码包含了指向常量池的引用。如果代码多,应用到的结构会更多!常量池表(Constant Pool Table) 是 Class 文件的一部分,用于存放编译期生成的各种字面量与符号应用,这部分内容将在类加载后存放到方法区的运行时常量池中。当创建类或者接口的运行时常量池时,如果构造运行时常量池所需的内存空间超过了方法区所提供的最大值,则 JVM 会抛 OutOfMemoryError 异常。原创 2022-12-11 09:33:16 · 474 阅读 · 0 评论 -
MinorGC、MajorGC、FullGC
当我们学习到JVM堆时,我们避免不了与GC打交道,其中大家经常混淆Minor GC、Major GC、Full GC,年轻代GC、老年代GC,本篇主要介绍Minor GC、Major GC、Full GC的区别。JVM堆内存被分为年轻代(Young Generation)和老年代(Old Generation)还有永久代和元空间,jdk1.8之前称为永久代,1.8之后称为元空间。Minor GC1.年轻代年轻代是所有新对象产生的地方,当年轻代内存空间被用完时,就会触发垃圾回收,这个垃圾回收叫做Minor G原创 2022-12-04 15:28:21 · 253 阅读 · 0 评论 -
JVM栈帧
栈帧是栈中的一个栈元素,是一中用于帮助虚拟机执行方法调用与方法执行的数据结构,当前线程中,每执行一个方法就会往栈中插入一个栈帧。栈帧本身是一种数据结构,封装了方法的局部变量表、动态链接信息、方法返回地址(即返回到方法的调用者)以及操作数栈Java虚拟机栈(Java Virtual Machine Stacks)是线程私有的,换句话说,每个线程都会有一个栈,所以对于栈帧来说不存在并发调用的情况。原创 2022-11-27 10:17:26 · 336 阅读 · 0 评论 -
JVM运行时数据区域之PCRegister和虚拟机栈
如果线程正在执行的是一个 Java 方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;是完全由具体的虚拟机实现自行决定的事情。与程序计数器一样,Java 虚拟机栈(Java Virtual Machine Stack)也是线程私有的,长度的 long 和 double 类型的数据会占用两个变量槽,其余的数据类型只占用一个。Java 虚拟机在执行 Java 程序的过程中会把它所管理的内存划分为若干个不同的数据。拟机规范》的规定,Java 虚拟机所管理的内存将会包括以下几个运行时数据区域,如图。原创 2022-11-20 10:39:10 · 447 阅读 · 0 评论