前言 JVM进行故障定位主要是对系统运行时的一些数据进行处理及分析,如堆栈信息、线程快照等。JDK自带了一些工具可以帮助开发人员或才运维人员进行故障定位。当然了在开发过程中可能用到的相对较少,一般是在线上环境时进行故障定位或才优化时需要相关数据分析。 这些工具包括虚拟机进程状况工具(jps)、虚拟机统计信息监视工具(jstat)、java配置信息工具(jinfo)、java内存映像工具...
背景事情最初是LZ这边用jersey提供的客户端API封装了一个rest客户端集成到业务系统A中,结果某次系统A在线上运行时崩了,分析线程栈的dump文件时,发现是因为大量线程阻塞拖跨了应用。线程阻塞的原因是因为jersey的方法内部存在同步操作,遇到流量陡增并且机器资源也比较紧张时对CPU调度产生了影响,导致线程阻塞耗时久,请求处理慢。恶性循环下,导致线程爆了。于是对封装的rest客...
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...
-XX:+UseSerialGC新生代和老年代都使用串行收集器串行收集器使用单线程并且是独占式的垃圾回收-XX:+UseParNewGC新生代使用ParNew垃圾回收器,老年代使用串行收集器ParNew是串行收集器的多线程版本,只工作在新生代(可以见名知义,ParNew:Paralle New,并行新生代)。可以考虑在CPU并发能力强的系统中使用ParNew,单CPU的话,性能...
jvm的线程栈申请的内存空间属于堆外内存,是向操作系统申请的,也不是JVM直接内存,虽然类似。JVM能创建的线程数需要的内存,不是JVM运行内存,堆内存,直接内存,而是操作系统剩余的可用内存,这个也决定了能创建的线程数,如果内存不够用,创建线程的时候便会出现内存溢出的错误。在操作系统的可用内存不足的情况下,想要创建更多的线程,可以考虑减少线程栈的空间大小(-Xss),但是不建议过小,栈尝试...
垃圾回收算法大体以下几类:1. 引用计数法2. 标记清除法3. 复制算法4. 标记压缩算法(标记整理)5. 分代算法、分区算法引用计数法对象有一个引用计数器,当一个对象被引用时,计数器加1,引用失效时,计数器减1,垃圾回收时,回收掉计数器为0的对象。缺点:无法避免循环引用。如下代码:user1和uesr2对象属于没有再被其它对象引用的,可以被回收的"垃圾"对象,...
CMS收集器CMS是一款基于“标记-清除”算法的收集器,更关注系统的停顿时间。GC主要步骤为:1. 初始标记2. 并发标记3. 重新标记4. 并发清除如果通过GC日志来看的话,如下GC日志:它的工作流程应当是:只有初始标记和重新标记是:Stop The World,其实都是并发处理,不会造成应用停顿因为CMS的并发处理,所以在并发清理阶段是和用户程序...
d s...
引言 配置不同的垃圾收集器,打印的gc日志也不相同,下面把不同的gc日志进行了打印,看到这个日志就知道当前堆内存的新生代、老年代用的是垃圾收集器类型。使用了参数-XX:+PrintGCDetails打印GC日志详细信息;jdk版本1.7。 查看gc日志,可以根据内存区域的名字确定当前区域使用的gc类型(记忆是需要技巧的)。GC日志NO.1新生代...
jvm的对象头的标记字段中关于年龄大小(存活区次数复制)的标记位分配的空间为2个字节,所以最大年龄只能是15,这也是我们经常在资料中看到的,说超过15,便从新生代提到老年代了。刚才看到有人问,如果设置大小比15大,虚拟机参数为:-XX:MaxTenuringThreshold。结果会怎么样。我觉得与其问,
前置说明这是一篇我自已关于双重检查锁存在的问题,以及volatile语义在其中的作用的理解。是一篇个人记录性文章,可能在语言描述上有些直白,不会引用太多官方专业术语解释或说明。有不正确的地方,也请留言指正。下面开始正文:一个单例实现假如现在有一个Earth(地球)类,需要提供一个它的懒汉式单例实现,一种常规写法如下:public class Earth { private static Earth earth = null; public static Earth getIn
Copyright © 2005-2024 51CTO.COM 版权所有 京ICP证060544号