![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
JVM性能调优
文章平均质量分 51
指尖流年999
试试
展开
-
G1垃圾收集器
G1垃圾收集器(-XX:+UseG1GC)面向服务器的垃圾收集器,主要针对多核服务器和大内存机器,以极高效率的满足gc停顿时间要求,同时具备高吞吐量性能特性。g1将内存区域划分为多个相等大小的独立区域region,最多2048个区域。每个区域的大小,用堆内存和2048相除,也可以使用参数:-XX:G1HeapRegionSize指定区域大小,一般是推荐默认大小。g1默认保留年轻代和老年代概念,但是不再物理隔阂,他们都是可以不连续的区域的集合。默认年轻代占堆内存5%,可以通过“-XX:G.原创 2021-12-22 18:14:23 · 354 阅读 · 0 评论 -
java垃圾收集器
垃圾收集器是垃圾收集算法的具体实现。根据具体的场景选择适合的垃圾收集器。Serial 收集器 (-XX:+UseSerialGC(年轻代) -XX:+UseSerialOldGC(老年代))Serial (串行)收集器是最早最古老的垃圾收集器。是单线程收集器,就是一个垃圾收集器线程去处理垃圾收集工作。收集垃圾的过程会暂停其他工作线程,(Stop The World)简称STW,知道收集结束。新生代采用复制算法,老年代采用标记-整理算法。优点:简单、高效。单线程执行 没有其他..原创 2021-12-22 15:29:41 · 1497 阅读 · 0 评论 -
JVM垃圾收集算法
标记-复制算法将内存分为大小相同的两块,每次只使用其中一块。标记存活的对象,当这一块的内存使用完后,将还存活的对象复制到另一块内存去,然后再将使用的内存清理掉。这样每次使用的是内存是一半。标记-清除算法两种方式:1、标记存活的对象,统一回收所有未被标记的对象;(通常是这种情况)2、标记要回收的对象,然后统一回收被标记的对象存在明显的问题:1、效率问题,如果需要标记的对象太多,效率太低。2、空间问题,标记清除后会有大量不连续的碎片空间;标记-整理算法标记..原创 2021-12-21 16:04:03 · 58 阅读 · 0 评论 -
java对象内存回收
如何判断堆中对象没有被引用需要回收。引用计数法给对象添加一个引用计数器,每当一个地方引用时,计数器加1,当引用失效的时候,计数器减1,当计数器为0的时候表示该对象没有被引用,可以被回收。这个方法简单高效,但是并没有被采用,主要是难以解决对象相互间循环引用问题。比如两个对象A和B,A引用B,B引用A,然后这两个对象没有其他引用,因为A和B相互引用,使得计数器不等于0,无法被垃圾收集器回收。...原创 2021-12-21 11:22:40 · 1426 阅读 · 0 评论 -
老年代空间分配担保机制
年轻代每次minor gc之前jvm都要计算老年代剩余可用空间。如果老年代剩余可用空间小于年轻代所有对象大小之和(包括垃圾对象)就会看一个"-XX:HandlePromiotionFailure"参数是否设置了,如果有这个参数,就会看老年代可用空间大小,会否大于之前每一次minor gc后进入老年代的对象的平均大小。如果小于或者或者参数没有配置,那就会触发full gc,对老年代和年轻代一起回收一次垃圾。如果回收完还是没有足够的空间存放对象就会发生oom。当然,如果minor gc之后剩余.原创 2021-12-21 10:24:36 · 449 阅读 · 0 评论 -
逃逸分析和标量替换
逃逸分析 用来确认对象是否被引用,如果不会逃逸(就是没有被引用),可以将该对象在栈上进行分配内存,让对象所在内存随着栈帧出栈而销毁,减轻垃圾回收的压力,减少临时对象在堆上分配内存。例如:开启逃逸分析参数-XX:+DoEscapeAnalysis,JDK7后默认开启逃逸分析,关闭把+改成-使用标量替换优先分配在栈上。标量替换通过逃逸分析确认对象不会逃逸后 ,将对象进一步分解成多个标量,将这些标量分配到栈上或者寄存器上分配内存空间,这样不会因为没有一大块连续空间导致对象内存不够...原创 2021-12-17 17:30:21 · 475 阅读 · 0 评论 -
双亲委派机制
类加载其实就是双亲委派机制,加载某个类的时候会先委托父类加载器寻找目标,找不到在委托到上层父类加载器,如果所有父类加载器都没有找到目标类,则在自己的类加载路径查找目标类。双亲委派机制简单点说,先找父类加载,找不到再从子类加载。源码中,调用loadClass方法的时候会先判断目标类是否已经加载过了,如果加载过就无需重复加载,直接返回,如果没有,去判断parent不为空,调用parent.loadClass方法,如果parent为空,则调用findBootstrapClassOrNull方法,有引导原创 2021-12-15 11:21:40 · 319 阅读 · 0 评论 -
类加载器初始化过程
类加载器类别:引导类加载器:BootStrapLoader 负责加载支撑JVM运行的位于JRE的lib目录下的核心类库,比如 rt.jar、charsets.jar等扩展类加载器:ExtClassLoader 负责加载支撑JVM运行的位于JRE的lib目录下的ext扩展目录中的JAR 类包应用程序加载器:AppClassLoader 负责加载ClassPath路径下的类包,加载自己写的那些类自定义加载器:负责加载自己自定义路径下面的类包类加载器初始化过程:执行java.ex.原创 2021-12-15 10:53:46 · 397 阅读 · 0 评论 -
java loadClass 类加载过程
加载--验证--准备--解析--初始化--使用--卸载加载:从硬盘中io获取到字节码文件,使用的类时才会进行加载,例如调用类的main方法,new对象等等,在加载阶段会在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口。验证:校验字节码文件是否正确。准备:给类的静态变量分配内存,并赋值初始值。比如int a=6,初始值是0;解析:将符号引用替换成直接引用,该阶段会把一些静态方法(符号引用,比如 main()方法)替换为指向数据所存内存的指针或原创 2021-12-14 17:30:53 · 466 阅读 · 0 评论