JVM和JVM调优
文章平均质量分 85
关于JVM的一些介绍和调优经验的分享
codergp
持之以恒的学习
展开
-
Java垃圾收集器(一)
1.什么是分代收集理论? 目前虚拟机的垃圾收集采用的都是分代收集算法:根据对象存活周期的不同将内存分为几块,再根据每一块内存的特性,实行不同的垃圾收集算法进行收集。 2.常见的垃圾收集算法 常见的垃圾收集算法有标记-复制算法,标记-清除算法,标记-整理算法。 标记-复制算法:它会将内存空间划分为大小相同的两块,每次只使用其中的一块,当这一块的内存使用完后,将还存活的对象复制到另一块去,然后再把使用完的这一块清理干净,这样每次回收内存都是对内存区域的一半进行回收。 标记-清除算法:该算法分为标原创 2023-06-28 19:41:15 · 98 阅读 · 1 评论 -
浅谈Java的对象创建
通过打印的相关信息我们可以清晰的看到,对象头中存储的数据以及一些其它数据,这里的klass pointer上图中没有相应的解释,这里说明一下,这个类型指针其实是对应方法区的类信息,至于对齐这一块,我们知道 8个字节 是对象寻址的最优解,所以虚拟机会增加对应的填充。,划分内存的方法通常有,指针碰撞(Java堆中的内存绝对规整)、空闲列表(Java堆中的内存并不规整)这两种方法,我们默认的是使用指针碰撞的方式进行分配,接下来我用画图的方式来解释下指针碰撞。虚拟机采用了两种方式来解决,首先就是我们熟悉的,原创 2023-06-20 10:49:09 · 152 阅读 · 1 评论 -
浅谈Java类加载
首先我们需要知道的是上面2中所说的类加载器是有一定亲戚关系的,我们可以理解为儿子是应用程序类加载器,爸爸是扩展类加载器,爷爷是引导类加载器,至于为啥这么规定呢,源码里是这么写的。加载某个类时会先委托父加载器寻找目标类,找不到再委托上层父加载器加载,如果所有父加载器在自己的加载类路径下都找不到目标类,则在自己的类加载路径中查找并载入目标类。关于类加载需要注意一点,当我们运行的程序用到某个类的时候这个类才会被加载,jar包和war包的类不是一次性全部加载的,有点类似spring中的懒加载。原创 2023-06-09 17:57:32 · 96 阅读 · 1 评论 -
Java垃圾收集器(三)
(默认5%): gc过程中空出来的region是否充足阈值,在混合回收的时候,对Region回收都 是基于复制算法进行的,都是把要回收的Region里的存活对象放入其他Region,然后这个Region中的垃圾对象全部清 理掉,这样的话在回收过程就会不断空出来新的Region,一旦空闲出来的Region数量达到了堆内存的5%,此时就会立 即停止混合回收,意味着本次混合回收就结束了。(默认85%) region中的存活对象低于这个值时才会回收该region,如果超过这 个值,存活对象过多,回收的的意义不大。原创 2023-07-14 11:04:29 · 42 阅读 · 1 评论 -
浅谈JVM
此处的栈我们可以称之为线程栈当然官网上说的Java虚拟机栈,之所以称它为线程栈,是因为每当一个线程启动时,栈就会划分一片很小的空间给它使用,而这些空间里又会有很多栈帧,可以认为一个线程中每拥有一个方法,这些栈空间就会划分一个栈帧给该方法;上图用红色框框标出来数字我们就可以理解成计数器记录的数据,至于为啥要记录,大家可以想想多线程的时候,我们程序执行到某个位置后被别的线程抢占了cpu那么当重新回来执行之前没执行完的代码时,不可能从头执行,所以程序计数器就是这个作用。局部变量表,操作数栈,动态链接,方法出口。原创 2023-06-14 16:16:54 · 476 阅读 · 0 评论 -
JVM 调优思路
这个因为之前已经大概知道Young GC的频率,假设是每5分钟一次,那么可以执行命令 jstat -gc pid 300000 10 ,观察每次结果eden, survivor和老年代使用的变化情况,在每次gc后eden区使用一般会大幅减少,survivor和老年代都有可能增长,这些增长的对象就是每次Young GC后存活的对象,同时还可以看出每次Young GC后进去老年代大概多少对象,从而可以推算出。知道了老年代对象的增长速率就可以推算出Full GC的触发频率了,Full GC的每次耗时可以用公式。原创 2023-07-17 17:26:53 · 48 阅读 · 1 评论 -
Java垃圾收集器(二)
上期说到了CMS垃圾收集器,它在并发标记和并发清理的过程中对象的引用可能发生变化,多标和漏标的情况就可能发生。所以CMS引用了三色标记算法来解决这个问题。黑色:表示已经被垃圾收集器访问过 且这个对象的所有引用都被扫描过。原创 2023-07-05 18:25:53 · 45 阅读 · 1 评论 -
浅谈Java对象的内存分配
看完上面的两个TIP我们就可以说说对象在堆中的分配了,大多数情况,对象是在新生代的Eden区分配的,当Eden区放满时会触发minor gc ,剩余存活的对象则会被挪到survior区 survior区分为 s1 , s2 区 首先会挪到s1区 ,当再次发生minor gc时 会清空 Eden 和 s1 将存活的对象挪动到 ,s2区,如果 survior区装不下,那么会提前挪动到老年代中。:分析对象的动态作用域,当一个对象在方法中被定义后,它可能被外部方法所引用,那么这种对象就不适合栈上分配。原创 2023-06-21 12:34:32 · 200 阅读 · 0 评论