JVM
文章平均质量分 61
叕叕666
这个作者很懒,什么都没留下…
展开
-
JVM的垃圾回收ParNew和CMS的介绍
- 第一个阶段:Initial Mark(初始标记阶段),CMS会找到"根"上的对象进行标记,不会标记非"根"的对象,此阶段会有STW,标记线程和业务线程不会并发执行 - 第二个阶段:Concurrent Mark(并发标记阶段),业务线程一边工作产生垃圾,回收线程一边标记垃圾,由于标记垃圾是GC最耗时的过程,所以CMS让回收线程个业务线程并发执行,业务线程虽然会慢一点但还是一直在执行的 - 第三个阶段:Remark(重新标记阶段),在第二阶段可能业务线程会产生新的垃圾,此阶段会把这些垃圾重新标记一下原创 2022-04-22 14:36:24 · 739 阅读 · 0 评论 -
JVM的垃圾回收Serial、Serial Old、Parallel Scavenge、Parallel Old的介绍和STW(Stop The World)
> Serial工作在年轻代,使用标记-复制的回收算法,它是单线程的垃圾回收器> Serial Old工作在老年代,使用标记-整理的回收算法,它也是单线程的垃圾回收器> Parallel Scavenge简称PS,使用标记-复制的回收算法,它是多线程的垃圾回收器 > Parallel Old简称PO,使用标记-整理的回收算法,它也是多线程的垃圾回收器原创 2022-04-21 14:10:17 · 1747 阅读 · 1 评论 -
三色标记算法实现原理
三色标记算法是什么三色标记就是把对象在逻辑上分成三种颜色:黑色,它自己是不是垃圾已经被标记完了,而且成员变量或牵扯到它引用的一些对象也已经标记完了;灰色,本身标记完了,但是还没有标记到它引用的那些对象,引用的那些对象还是白色没有标记到的;白色,还没被标记到的对象。假如有一个对象A,它所引用的对象B和C都已经标记完了,那它自己也标记完了黑色;B和C各自还有一个引用指向白色对象没标记到,那这个B和C自己遍历到孩子还没有遍历到就是灰色,D和E就是白色那个没有遍历到的节点三色标记算法的漏标问题原来灰原创 2022-04-20 14:03:46 · 388 阅读 · 0 评论 -
java对象的内存布局以及使用ClassLayout查看布局
<dependency> <groupId>org.openjdk.jol</groupId> <artifactId>jol-core</artifactId> <version>0.16</version></dependency>对象的内存布局分为两种,普通对象和数组对象普通对象普通对象有四部分组成对象头(MarkWord)、ClassPointer指针、实例数据、Padding对齐对象原创 2022-04-15 12:05:20 · 2322 阅读 · 2 评论 -
CPU的缓存行(Cache Line)是什么
存储器的层次结构存储器的层次如下:其中,L1、L2在CPU内部,L3在主板上,越往上CPU到达的时间越短,CPU内部的数据是独立的,CPU外部的数据是所有CPU共享的。CPU的数据不一致问题产生原因假如主存里有x、y两个数据,它们会先被加载到L3缓存里,让在加载到L1、L2缓存,但是L1、L2是在CPU内部的,那就有可能CPU1把x加载到缓存修改成1,CPU2把x加载到缓存修改成2,产生CPU之间的数据不一致问题,也就是CPU1修改数据CPU2不知道。解决方案方案一:总线锁。由于L2是通过使原创 2022-04-12 13:43:24 · 2679 阅读 · 0 评论 -
Java类加载的过程
类的生命周期一个类从从被加载到JVM内存开始,到卸载出内存为止,它的整个生命周期会经历七个阶段,其中验证、准备、解析统称为连接。加载、验证、准备、初始化、卸载这五个阶段的顺序是固定的,解析阶段在某些情况下会在初始化阶段之后进行。在《java虚拟机规范》中严格规定了有且只有六种情况必须立即对类进行加载、验证、准备、初始化(下文所说的初始化阶段是这四个阶段的简称):遇到new、getstatic、putstatic或invokestatic 这四条字节码指令时,如果类型没有进行过初始化,则需要原创 2022-04-08 14:10:07 · 449 阅读 · 0 评论 -
java中的类加载器(Class Loader)和双亲委派
类加载器(Class Loader)什么是类加载器java中可以通过一个类的的全限定名来获取描述该类的二进制字节流,这个动作是由代码来实现的,这些代码就是类加载器(Class Loader)类加载器的层级:Bootstrap Class Loader - 启动类加载器此加载器负责加载JAVA_HOME/lib目录下的类库文件或者是被JVM参数-Xbootclasspath所指定路径下的类库文件,并且这些文件需要JVM可以识别,否则即使放到JAVA_HOME/lib目录下也不会被加载测试代码p原创 2022-04-07 13:51:54 · 415 阅读 · 0 评论 -
java 中volatile的作用及其实现原理和JVM的内存屏障
堆虽然是所有线程共享的,但是每个线程还有只属于自己的空间,当一个线程去堆中取值时会复制一份到自己的空间,对这个这个值进行修改会先在自己的空间里修改然后再写到堆中,但是其他线程是不知道你修改了,这就是线程之间的不可见。加了volatile之后就能够保证一个线程修改另一个线程马上就能看到。原创 2022-03-28 13:26:37 · 888 阅读 · 0 评论 -
JVM的常用参数
-Xms2g:初始化推大小为 2g;-Xmx2g:堆最大内存为 2g;-XX:NewRatio=4:设置年轻的和老年代的内存比例为 1:4;-XX:SurvivorRatio=8:设置新生代 Eden 和 Survivor 比例为 8:2;–XX:+UseParNewGC:指定使用 ParNew + Serial Old 垃圾回收器组合;-XX:+UseParallelOldGC:指定使用 ParNew + ParNew Old 垃圾回收器组合;-XX:+UseConcMarkSweepGC:指原创 2021-03-31 11:43:27 · 216 阅读 · 0 评论 -
常见的垃圾回收算法
判断对象是否可以被回收的算法引用计数器法:为每个对象创建一个引用计数,有对象引用时计数器 +1,引用被释放时计数 -1,当计数器为 0 时就可以被回收。它有一个缺点不能解决循环引用的问题。可达性分析算法:从 GC Roots 开始向下搜索,搜索所走过的路径称为引用链。当一个对象到 GC Roots 没有任何引用链相连时,则证明此对象是可以被回收的。进行垃圾回收算法标记-清除算法:标记无用对象,然后进行清除回收。优点:实现简单,不需要对象进行移动。缺点:标记、清除过程效率低,原创 2021-03-31 11:15:30 · 146 阅读 · 0 评论 -
Java的内存模型
堆:创建的对象放在此区域,此区域被线程所共享方法区:存放类的一些信息,例如,常量,静态变量等,此区域被线程所共享java栈:方法的在此区域压栈,此区域是线程私有的本地方法栈:使用方法服务,例如netty的方法服务程序计数器:记录字节码执行的位置,使每个线程都能正确执行完方法...原创 2021-03-30 20:43:56 · 64 阅读 · 0 评论