![](https://img-blog.csdnimg.cn/2019091813595558.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
jvm
文章平均质量分 55
jvm
Pr Young
一个踏实努力,充满激情的程序员!
展开
-
三色标记法(总结的非常牛逼,包教包会,不看后悔)
黑色:本对象被访问过,本对象的孩子节点(对象A的属性引用了对象B,则对象A的孩子结点就是对象B)也被访问过。这个时候A,C的孩子结点已经被访问过了,所以A,C符合自己和孩子都被访问过了的条件,于是加入到黑色队列中。step2.将对象A,C的孩子结点B,D加进灰色队列中(也就是说访问B,D结点)将D对象的孩子结点E,G加入到灰色队列中(也就是说访问E,G对象)灰色:介于白色和黑色之间,本对象已经访问过,但是本对象的孩子节点还没有访问。L,M,N三个对象从始至终一直是白色对象,白色对象就是要被回收的对象。原创 2023-03-14 01:38:37 · 131 阅读 · 0 评论 -
常见垃圾回收器
重新标记: 由于上一个阶段并发标记阶段其他用户线程实际上还是在运行的,有可能用户线程在这个阶段产生了新的对象(这些新的对象是没有打上标记的),这里采用三色标记法来标记那些新产生的对象 ‘并发标记:这个阶段,CMS线程和其他用户线程在并发执行,CMS线程会从与GC Roots直接相连的对象出发,遍历整个对象图 ,进行标记对象。显然所有的阶段里面只有初始标记和重新标记的时候需要stop the world叫停其他用户线程,其他阶段都是CMS线程和用户线程可以并行的。1.Serial垃圾回收器。原创 2022-12-21 21:50:03 · 1003 阅读 · 1 评论 -
分代收集算法
新创建一个对象,会将这个对象放在eden伊甸园区,eden区占满之后,就会触发minor GC,复制eden区里面不能被回收的对象,复制到ServiceFrom区,然后清空eden区(此时只有ServiceFrom区有元素,其他两个区是空的)将这个堆内存划分成两块:新生代和老年代,刚刚创建的对象都在新生代,长久存活的对象都在老年代(老年代的垃圾回收很久发生一次,新生代的垃圾回收发生的比较频繁)这个参数进行设置,默认3M,即使Eden区有足够的空间来存放,也不会存放在Eden区,而是直接存入老年代)原创 2022-12-21 15:22:56 · 571 阅读 · 1 评论 -
如何判断一个对象是否应该被回收?
首先定义一些GC Roots对象,然后以这些GC Roots对象作为起点向下搜索,如果在GC roots和一个对象之间没有可达路径,则称该对象是不可达的。不可达对象要经过至少两次标记才能判定其是否可以被回收,如果在两次标记后该对象仍然是不可达的,则将被垃圾收集器回收。可以通过引用计数法来判断一个对象是否可以被回收。在为对象添加一个引用时,引用计数加1;如果一个对象的引用计数为0,则表示此刻该对象没有被引用,可以被回收。采用引用计数法和可达性分析两种方法来判断一个对象是否应该被回收。原创 2022-12-21 14:58:06 · 1237 阅读 · 0 评论 -
JVM的作用,结构
1.虚拟机栈:栈由一个个栈帧组成,而每个栈帧中都拥有:局部变量表、操作数栈、动态链接、方法返回地址。和数据结构上的栈类似,两者都是先进后出的数据结构,只支持出栈和入栈两种操作。(2) 执行引擎:即时编译器(将字节码编译成机器码)+垃圾回收器(回收运行过程中不再使用的对象)jdk1.7之前,运行时常量池和字符串常量池都在方法区里面,jdk1.7把字符串常量池移到堆中了。接下来分别介绍运行时数据区中的五部分:虚拟机栈,本地方法栈,程序计数器,堆区,方法区。5.方法区 jdk1.8后方法区变成了元空间。原创 2022-12-20 23:12:48 · 596 阅读 · 0 评论 -
字节码文件(.class文件)
前四个字节(也就是第0号字节到第3号字节) ca fe ba be叫做魔数,表示这个文件是一个class类型的文件(如果是其他字母,可能就表示是其他类型的文件)这个构造方法对应的字节码指令为: 2a b7 00 01 b1。接下来两个字节(8~9):00 23 表示常量池的长度 十六进制的23等于35,由于#0项不计入,所以实际上有#1~#34。接下来四个字节(4~7):00 00 00 34表示版本,表示是Jdk 8版本。1.字节码文件(.class文件)结构解析:字节码文件长啥样,里面有什么。原创 2022-11-03 21:10:34 · 2996 阅读 · 0 评论 -
垃圾回收调优(GC调优)
XX:+HeapDumpOnOutOfMemoryError 出现异常时输出堆内信息,这个一般要配合: -XX:HeapDumpPath=******使用,指定输出路径。避免新生代设置过小,当新生代设置过小时,会带来两个问题:一是minor GC次数频繁,二是可能导致 minor GC对象直接进老年代(老年代对象太多会触发Full GC)实际上,优先架构调优和代码调优,JVM优化是不得已的手段,大多数的Java应用不需要进行JVM优化。原创 2022-11-03 16:56:18 · 317 阅读 · 0 评论 -
强引用,软引用,弱引用,虚引用
当直接引用消失了,当发生垃圾回收的时候,如果此时当内存不够的时候,会回A2对象,如果内存时够的,不会回收A2对象。引用是最弱的一种引用关系,如果一个对象仅持有虚引用,那么它就和没有任何引用一样,它随时可能会被回收。当直接引用消失的时候,当发生垃圾回收的时候,不管内存够不够,都会回收A3对象。软引用就是被root C对象间接引用,同时被root对象 B对象直接引用。弱引用也是被root C对象间接引用,同时被root对象 B对象直接引用。A1对象同时被两个根对象B,C直接引用。1.强引用 (就是直接引用)原创 2022-10-25 17:48:49 · 199 阅读 · 0 评论 -
第0篇:jvm的作用:运行.class字节码文件
jvm使得java语言能够实现跨平台,一次编译,到处运行。原创 2022-10-23 16:58:29 · 112 阅读 · 0 评论 -
三种垃圾回收算法
目前,大部分JVM在新生代都采用了复制算法,因为在新生代中每次进行垃圾回收时都有大量的对象被回收,需要复制的对象(存活的对象)较少,不存在大量的对象在内存中被来回复制的问题,因此采用复制算法能安全、高效地回收新生代大量的短生命周期的对象并释放内存。首先将内存划分为两块大小相等的内存区域,即区域1和区域2,新生成的对象都被存放在区域1中,在区域1内的对象存储满后会对区域1进行一次标记,并将标记后仍然存活的对象全部复制到区域2中,这时区域1将不存在任何存活的对象,直接清理整个区域1的内存即可。原创 2022-10-03 13:18:54 · 1090 阅读 · 0 评论 -
第二篇:新生代,老年代,永久代
因此,元空间的大小不受JVM内存的限制,只和操作系统的内存有关。在Java 8中,JVM将类的元数据放入本地内存(Native Memory)中,将常量池和类的静态变量放入Java堆中,这样JVM能够加载多少元数据信息就不再由JVM的最大可用内存(MaxPermSize)空间决定,而由操作系统的实际可用内存空间决定。新创建的对象会被存在Eden区(但是如果新创建的对象属于大对象,则会将这个大对象分配到老年代,大对象的定义和具体的JVM版本、堆大小和垃圾回收策略有关,一般为2KB~128KB)原创 2022-10-03 12:42:12 · 559 阅读 · 0 评论 -
第一篇文章:JVM虚拟机的作用和组成
不同操作系统(Linux,Windows,Mac)的解释器将.class文件编译成在不同操作系统上的机器码,这就是Java能够跨平台的原因。(3) 执行引擎:包括即使编译器(用于将字节码编译成机器码)和垃圾回收器(回收运行过程中不再使用的对象)java源文件通过编译器被编译成.class文件,这个.class文件又被JVM中的解释器编译成机器码。注意:运行时数据区中,程序计数器,虚拟机栈,本地方法区是线程私有的区域。(2) 运行时数据区:存储JVM运行过程中产生的数据。1.JVM虚拟机的作用。原创 2022-10-03 11:26:32 · 558 阅读 · 0 评论 -
第一篇文章:类加载器和双亲委派机制
如果一个类加载器收到了类加载请求,它并不会自己先去加载,而是把这个请求委托给父类的加载器去执行,如果父类加载器还存在其父类加载器,则进一步向上委托,最终将到达顶层的启动类加载器。自定义类加载器 通过继承ClassLoader实现,一般是加载我们的自定义类父类加载器为AppClassLoader。如果父类加载器可以完成类加载任务,就成功返回,倘若父类加载器无法完成此加载任务,子加载器才会尝试自己去加载。通过这种层级关可以避免类的重复加载,当父亲已经加载了该类时,就没有必要子ClassLoader再加载一次。.原创 2022-08-25 18:50:33 · 218 阅读 · 0 评论 -
JVM体系
JVM体系:原创 2022-08-25 17:14:35 · 72 阅读 · 0 评论