![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
jvm
jvm
不识君的荒漠
apche rocketmq contributor、incubator-shenyu contributor,基础组件研发方向。
展开
-
打印所有JVM参数值
打印参数-XX:+PrintFlagsFinal示例执行java -version进程的时候,打印当前所有JVM参数的值,输出到final.txtjava -XX:+PrintFlagsFinal -version > final.txt= : 表示默认值 := :表示设置了该属性的值 上图第1列是值类型,第2列是属性名,第3列是当前属性值扩展打印所有参数初始值java -XX:+PrintFlagsInitial打印被设置的参数java ...原创 2021-03-22 00:28:23 · 2756 阅读 · 1 评论 -
双检锁为什么需要使用volatile关键字
前置说明这是一篇我自已关于双重检查锁存在的问题,以及volatile语义在其中的作用的理解。是一篇个人记录性文章,可能在语言描述上有些直白,不会引用太多官方专业术语解释或说明。有不正确的地方,也请留言指正。下面开始正文:一个单例实现假如现在有一个Earth(地球)类,需要提供一个它的懒汉式单例实现,一种常规写法如下:public class Earth { private static Earth earth = null; public static Earth getIn原创 2020-10-12 00:34:51 · 972 阅读 · 0 评论 -
java对象头标记字段里年龄最大是15,设置超过大小会怎么样
jvm的对象头的标记字段中关于年龄大小(存活区次数复制)的标记位分配的空间为2个字节,所以最大年龄只能是15,这也是我们经常在资料中看到的,说超过15,便从新生代提到老年代了。刚才看到有人问,如果设置大小比15大,虚拟机参数为:-XX:MaxTenuringThreshold。结果会怎么样。我觉得与其问,不如测一下,我也很好奇,测试过程又不麻烦,所以测试结果如下:设置-XX:MaxTenuringThreshold=16代码:public class TenuringThreshold原创 2020-08-05 00:43:59 · 1584 阅读 · 1 评论 -
根据GC日志判断使用的GC(垃圾收集器)类型
引言 配置不同的垃圾收集器,打印的gc日志也不相同,下面把不同的gc日志进行了打印,看到这个日志就知道当前堆内存的新生代、老年代用的是垃圾收集器类型。使用了参数-XX:+PrintGCDetails打印GC日志详细信息;jdk版本1.7。 查看gc日志,可以根据内存区域的名字确定当前区域使用的gc类型(记忆是需要技巧的)。GC日志NO.1新生代...原创 2019-09-01 23:12:46 · 1160 阅读 · 0 评论 -
CMS收集器的gc情况分析
CMS收集器CMS是一款基于“标记-清除”算法的收集器,更关注系统的停顿时间。GC主要步骤为:1. 初始标记2. 并发标记3. 重新标记4. 并发清除如果通过GC日志来看的话,如下GC日志:它的工作流程应当是:只有初始标记和重新标记是:Stop The World,其实都是并发处理,不会造成应用停顿因为CMS的并发处理,所以在并发清理阶段是和用户程序...原创 2019-06-05 22:36:09 · 531 阅读 · 0 评论 -
重写finalize方法的类实例,在其它类中被弱引用遇到gc的问题
示例类FinalizeOverride对象初始化时有个1M的数组属性。public class FinalizeOverride { private byte[] bytes = new byte[1024 * 1024]; public byte[] getBytes() { return bytes; } public void s...原创 2019-05-27 23:36:16 · 1050 阅读 · 0 评论 -
垃圾回收算法
垃圾回收算法大体以下几类:1. 引用计数法2. 标记清除法3. 复制算法4. 标记压缩算法(标记整理)5. 分代算法、分区算法引用计数法对象有一个引用计数器,当一个对象被引用时,计数器加1,引用失效时,计数器减1,垃圾回收时,回收掉计数器为0的对象。缺点:无法避免循环引用。如下代码:user1和uesr2对象属于没有再被其它对象引用的,可以被回收的"垃圾"对象,...原创 2019-05-17 23:16:56 · 311 阅读 · 0 评论 -
jvm线程栈空间内存分配位置
jvm的线程栈申请的内存空间属于堆外内存,是向操作系统申请的,也不是JVM直接内存,虽然类似。JVM能创建的线程数需要的内存,不是JVM运行内存,堆内存,直接内存,而是操作系统剩余的可用内存,这个也决定了能创建的线程数,如果内存不够用,创建线程的时候便会出现内存溢出的错误。在操作系统的可用内存不足的情况下,想要创建更多的线程,可以考虑减少线程栈的空间大小(-Xss),但是不建议过小,栈尝试...原创 2019-05-21 23:44:02 · 7789 阅读 · 3 评论 -
JVM配置启用几种垃圾收集器的参数说明
-XX:+UseSerialGC新生代和老年代都使用串行收集器串行收集器使用单线程并且是独占式的垃圾回收-XX:+UseParNewGC新生代使用ParNew垃圾回收器,老年代使用串行收集器ParNew是串行收集器的多线程版本,只工作在新生代(可以见名知义,ParNew:Paralle New,并行新生代)。可以考虑在CPU并发能力强的系统中使用ParNew,单CPU的话,性能...原创 2019-05-19 22:10:20 · 3211 阅读 · 0 评论 -
JVM常用GC日志打印参数
1. PrintGC最简单的GC参数。启用配置:-XX:+PrintGC日志如下:根据上面红色方框内的数字1、2、3、4、5说明,1是GC类型,GC:minor GC(young gc),Full GC:major GC,2是GC前堆内存使用量,3是GC后堆内存使用量,4是堆内存总量,5是本次GC耗时2. PrintGCDetails打印GC的详细信息启用配置:-X...原创 2019-05-09 00:58:28 · 21136 阅读 · 2 评论 -
记一次full gc耗时且频繁的故障定位
背景事情最初是LZ这边用jersey提供的客户端API封装了一个rest客户端集成到业务系统A中,结果某次系统A在线上运行时崩了,分析线程栈的dump文件时,发现是因为大量线程阻塞拖跨了应用。线程阻塞的原因是因为jersey的方法内部存在同步操作,遇到流量陡增并且机器资源也比较紧张时对CPU调度产生了影响,导致线程阻塞耗时久,请求处理慢。恶性循环下,导致线程爆了。于是对封装的rest客...原创 2019-04-24 20:18:30 · 9250 阅读 · 0 评论 -
阿里重磅开源在线分析诊断工具Arthas(阿尔萨斯)
github地址:ArthasEnglish version goeshere.Arthas是Alibaba开源的Java诊断工具,深受开发者喜爱。当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决:这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception? 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了? 遇到问题无法...转载 2019-04-23 19:55:26 · 646 阅读 · 0 评论 -
jvisualvm监控本地进程查看不到线程信息,且CPU报:Not supported for this JVM
背景我本来是想查看一个本地java进程的线程堆栈信息,因为是在我本机中,所以想着用jvisualvm工具来看方便,省得敲命令,然而问题来了,不仅没有线程信息,而且jstack也不管用了现象下图是我机器上有问题的进程使用jvisualvm查看的结果:在导航栏的Montior右边没有Threads信息,并且CPU监控这个区域,报的是Not supported for th...原创 2018-12-28 10:25:04 · 3558 阅读 · 0 评论 -
JDK内置帮助JVM故障定位与处理的几个小工具的简单使用
前言 JVM进行故障定位主要是对系统运行时的一些数据进行处理及分析,如堆栈信息、线程快照等。JDK自带了一些工具可以帮助开发人员或才运维人员进行故障定位。当然了在开发过程中可能用到的相对较少,一般是在线上环境时进行故障定位或才优化时需要相关数据分析。 这些工具包括虚拟机进程状况工具(jps)、虚拟机统计信息监视工具(jstat)、java配置信息工具(jinfo)、java内存映像工具...原创 2018-04-09 00:33:40 · 1292 阅读 · 0 评论