网站的登录注册页面怎么做的,软件发布网站源码,wordpress+设定首页,wordpress订阅者经过前几篇的铺垫#xff0c;现在开始正式进入调优篇#xff0c;也是大火实际用的到的和感兴趣的#xff0c;但是前期的知识积累还是有必要的#xff0c;所以还对JVM基础没什么了解的#xff0c;建议还是回看主包的前几篇内容#xff0c;当然看其他优秀的博主也是可以的。…经过前几篇的铺垫现在开始正式进入调优篇也是大火实际用的到的和感兴趣的但是前期的知识积累还是有必要的所以还对JVM基础没什么了解的建议还是回看主包的前几篇内容当然看其他优秀的博主也是可以的。性能调优三步骤 发现问题——性能监控我们通过GUI图形工具或者JVM命令后对程序进行监控如出现FullGC频率过高、CPU负载较高、死锁、OOM内存泄漏/溢出或者更加简单的就是程序莫名其妙响应时间过长大白话就是卡顿。排查问题——性能分析通过对内存的分析、查看GC日志、查看JVM状态、已经堆栈信息来确定大概的调优方向分析出那个区域需要调整。解决问题——性能调优经过监控和分析已经知道了问题的大致方向然后进行处理比如增加内存的大小、使用消息队列缓存、增加机器也就是分布式减轻压力、优化代码控制内存的使用。 这个图来自于尚硅谷的宋红康老师的课程主包也是跟着宋老师学习整理的资料想学习的更加细节和系统化可以去某站搜索。jps列出当前用户的所有Java进程
jps -lvm
//-q只显示进程ID
//-l显示完整包名
//-v显示JVM参数
//-m显示main方法的参数jps -l
22417 jdk.jcmd/sun.tools.jps.Jps //jps也是个java进程
22260 org.jetbrains.jps.cmdline.Launcher //idea编译进程
2422 //僵尸或者特殊进程不用理会
32988 com.example.seed.SeedApplication//项目进程
89423 com.intellij.idea.Main //idea主进程这里说一下其实我们使用的命令全部是在JDK的bin目录下主包这个是Mac文件的类型显示的就是Unix可执行的文件要是Window就应该是.exe的文件有兴趣的小伙伴可以自己去查看一下。 另外这个脚步使用的文件就在/home/lib/tools.jar中在jar包的/sun/tools目录下也是一个字节码文件又兴趣的小伙伴可以自己去查看这边就不演示了。如果使用了-XX:-UserPerfData那么jps和jstat都无法探查这个进程因为关闭了用户性能数据jstat - JVM统计监控工具
jstat -option [-t] [-hlines] vmid [interval [count]]
--option//操作参数必填
--[-t] //JVM启动到现在的时间
[-hlines]//每几行重新打印表头
--vmid //Java进程Pid
[interval//每次打印的间隔时间10001秒
[count]]//打印次数选项说明-class类加载统计-compilerJIT编译器统计-gcGC统计-gccapacity各内存区域容量统计-gcutilGC统计百分比-gccauseGC统计及原因同-gcutil但包含最近一次GC原因-gcnew新生代GC统计-gcnewcapacity新生代内存容量统计-gcold老年代GC统计-gcoldcapacity老年代内存容量统计-gcmetacapacity元空间内存容量统计-printcompilationJVM编译方法统计 图太小的话就放大来看吧这里就是完整的命令格式当然必须要大就是操作和PID参数其他的看各自的需求了这个命令也是查看JVM最多的命令可以查的消息还是很全面的。列名说明示例值TimestampJVM 启动后的时间戳秒134663.6S0CSurvivor 0 区容量KB0.0S1CSurvivor 1 区容量KB6144.0S0USurvivor 0 区已使用KB0.0S1USurvivor 1 区已使用KB6144.0ECEden 区容量KB51200.0EUEden 区已使用KB32768.0OC老年代容量KB40960.0OU老年代已使用KB32549.8MCMetaspace 容量KB54528.0MUMetaspace 已使用KB53845.6CCSC压缩类空间容量KB7488.0CCSU压缩类空间已使用KB7206.5YGC年轻代 GC 次数10YGCT年轻代 GC 总时间秒0.126FGCFull GC 次数0FGCTFull GC 总时间秒0.000CGCConcurrent GC 次数4CGCTConcurrent GC 总时间秒0.002GCT所有 GC 总时间秒0.128这个呢就是各个打印代表的意思了。其他的操作主包我就不演示了。其实使用这个命令就可以判断内存是否有益处的风险比如我们采用抽样调查的方法相同的时间间隔下去对老年区进行监控如果老年区内存占用在某一个时间段激增或者每段时间都增加的比较多可能就是内存泄漏无法回收了。因为一般情况下除了静态文件和Spring容器、数据库连接池、监听器等不会被回收其他的基本上这个请求已结束等到下一个E去GC就会被回收的如果一直没有被回收肯定就是内存泄漏了。jinfo 查看和修改正在运行的 Java 进程的配置参数
jinfo [option] pid参数选项作用-flags显示所有 JVM 参数包括默认参数-sysprops显示所有系统属性相当于 System.getProperties()-flag name显示指定 JVM 参数的值-flag [/-]name启用或禁用指定的布尔型 JVM 参数-flag namevalue设置指定的 JVM 参数值无参数同时显示系统属性和 JVM 参数
//查看最大的堆空间值jinfo -flag MaxHeapSize 32988
-XX:MaxHeapSize4294967296-flag [/-]name - 修改布尔型参数
# 启用PrintGCDetails
jinfo -flag PrintGCDetails 12345-flag namevalue - 修改数值型参数
# 修改MaxHeapFreeRatio
jinfo -flag MaxHeapFreeRatio70 12345
好了主包这里只示范简单的几个命令主包个人其实这个命令只有两个操作一个是flags一个就是flag也很好记忆了而且用处也是非常大的就比如这个动态修改JVM参数了。不加任何参数查看的信息就非常的全了大火快去自行尝试一下。另外不是所有的JVM参数都能被修改的这也是人之常情了只有被manageable标记的参数。java -XX:PrintFlagsFinal | grep manageable这个命令可以查看大概能改的参数就是这些了主包这个是JDK21可能和大家的不一样大家还是自己看看吧。 jmap 用于生成Java堆转储快照heap dump和分析堆内存使用情况这个命令的作用主要就是生成dump的二进制文件然后进行内存分析的当然需要借助工作不然我们可是看不懂二进制文件的然后就是查询类加载器信息、查看finalizer队列、分析对象内存分布用的多多主包已经飙红了。
jmap [options] pid # 连接运行中的Java进程
jmap [options] executable core # 连接核心转储文件
jmap [options] [server_id]remote server IP or hostname # 连接远程调试服务器参数功能描述适用场景-dump生成堆转储文件Heap Dump内存泄漏分析、OOM 问题诊断-heap显示堆内存配置和使用摘要快速查看堆内存分配情况-histo显示堆中对象统计直方图分析对象内存占用-clstats显示类加载器统计信息类加载问题诊断-finalizerinfo显示等待 finalize 的对象对象回收问题诊断-F强制模式当进程挂起时使用JVM 无响应时的强制转储
#活着的对象
jmap -dump:[live,]formatb,filefilename pid
#全部的对象包括死的
jmap -dump:formatb,filefilename pid
//例如
jmap -dump:live,formatb,file./Downloads/testH.hprof 32988关键词作用是否可选示例值-dump主命令表示要执行堆转储操作必选-live只转储存活对象(会触发Full GC)可选包含或不包含formatb指定输出格式为二进制必选必须为bfilefilename指定输出文件路径必选heap.hprofpid目标Java进程ID必选1234在我们分析的时候大多数选择的都是存活的对象因为 一般没有被回收的对象就是存活的而且要死全部都看的话一个是这个文件回很大另一个就是分析起来不是那么好分析需要的时间也就是更长了此外还有一个办法可以获得dump文件那就是JVM参数因为大多少程序出现OOM崩溃的时候开发人员是不能第一时间获得这个文件的来不及和不可预测所有我们需要使用JVM参数来获取崩溃时的内存快照。
-XX:HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath/path/to/dump/file.hprof这俩参数相信大家也能看明白我就不介绍了。下面就是-heap和-histo的运行实例了其他的就不演示了。
#查看堆内存信息
jmap -heap pid
Attaching to process ID 12345, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.131-b11using thread-local object allocation.
Parallel GC with 4 thread(s) # 使用的GC类型Heap Configuration: # 堆配置参数MinHeapFreeRatio 40MaxHeapFreeRatio 70MaxHeapSize 2147483648 (2048.0MB) # 最大堆NewSize 715653120 (682.5MB) # 新生代大小MaxNewSize 715653120 (682.5MB)OldSize 1431830528 (1365.5MB) # 老年代大小NewRatio 2 # 新生代/老年代比例SurvivorRatio 8 # Eden/Survivor比例MetaspaceSize 21807104 (20.796875MB) # 元空间CompressedClassSpaceSize 1073741824 (1024.0MB)G1HeapRegionSize 0 (0.0MB)Heap Usage: # 堆使用情况
PS Young Generation # 并行年轻代
Eden Space: # Eden区capacity 537919488 (513.0MB)used 536870912 (512.0MB)free 1048576 (1.0MB)99.8% used
From Space: # Survivor From区capacity 89128960 (85.0MB)used 0 (0.0MB)free 89128960 (85.0MB)0.0% used
To Space: # Survivor To区capacity 89128960 (85.0MB)used 0 (0.0MB)free 89128960 (85.0MB)0.0% used
PS Old Generation # 并行老年代capacity 1431830528 (1365.5MB)used 536870912 (512.0MB)free 894959616 (853.5MB)37.5% used# 其他信息...
jmap -histo[:live] pid [ 输出文件]
# 统计所有对象包含未被回收的对象前20个
jmap -histo 12345 | head -20jmap -histo:live 32988 | head -20num #instances实例数量 #bytes字节大小 class name (module)
-------------------------------------------------------1: 81074 12879208 [B (java.base21.0.5)2: 73927 1774248 java.lang.String (java.base21.0.5)3: 18267 1607496 java.lang.reflect.Method (java.base21.0.5)4: 48478 1551296 java.util.concurrent.ConcurrentHashMap$Node (java.base21.0.5)5: 13055 1546952 java.lang.Class (java.base21.0.5)6: 7083 1236824 [I (java.base21.0.5)7: 13298 842456 [Ljava.lang.Object; (java.base21.0.5)8: 6582 485232 [Ljava.util.HashMap$Node; (java.base21.0.5)9: 12046 481840 java.util.LinkedHashMap$Entry (java.base21.0.5)10: 7367 471488 java.util.LinkedHashMap (java.base21.0.5)11: 393 452112 [Ljava.util.concurrent.ConcurrentHashMap$Node; (java.base21.0.5)12: 11288 361216 java.util.HashMap$Node (java.base21.0.5)13: 18351 293616 java.lang.Object (java.base21.0.5)14: 10053 260904 [Ljava.lang.Class; (java.base21.0.5)15: 4872 233856 java.lang.invoke.MemberName (java.base21.0.5)16: 8861 212664 org.springframework.core.MethodClassKey17: 2970 166320 org.springframework.core.ResolvableType18: 353 158216 [Ljdk.internal.vm.FillerElement; (java.base21.0.5)总结本篇主要讲了进行性能调优要做的那些步骤以及jps、jstat、jinfo、jamp的命令介绍请大家一定要多多尝试光看肯定是记不住的。