关于java12:面试官你工作中做过-JVM-调优吗怎么做的
最近很多小伙伴跟我说,本人学了不少JVM的调优常识,然而在理论工作中却不晓得何时对JVM进行调优。明天,我就为大家介绍几种JVM调优的场景。 在浏览本文时,假设大家曾经理解了运行时的数据区域和罕用的垃圾回收算法,也理解了Hotspot反对的垃圾回收器。cpu占用过高cpu占用过高要分状况探讨,是不是业务上在搞流动,忽然有少量的流量进来,而且流动完结后cpu占用率就降落了,如果是这种状况其实能够不必太关怀,因为申请越多,须要解决的线程数越多,这是失常的景象。话说回来,如果你的服务器配置自身就差,cpu也只有一个外围,这种状况,略微多一点流量就真的可能把你的cpu资源耗尽,这时应该思考先把配置晋升吧。 第二种状况,cpu占用率长期过高,这种状况下可能是你的程序有那种循环次数超级多的代码,甚至是呈现死循环了。排查步骤如下: (1)用top命令查看cpu占用状况 这样就能够定位出cpu过高的过程。在linux下,top命令取得的过程号和jps工具取得的vmid是雷同的: (2)用top -Hp命令查看线程的状况 能够看到是线程id为7287这个线程始终在占用cpu (3)把线程号转换为16进制 [[email protected] ~]# printf "%x" 72871c77记下这个16进制的数字,上面咱们要用 (4)用jstack工具查看线程栈状况 [[email protected] ~]# jstack 7268 | grep 1c77 -A 10"http-nio-8080-exec-2" #16 daemon prio=5 os_prio=0 tid=0x00007fb66ce81000 nid=0x1c77 runnable [0x00007fb639ab9000] java.lang.Thread.State: RUNNABLE at com.spareyaya.jvm.service.EndlessLoopService.service(EndlessLoopService.java:19) at com.spareyaya.jvm.controller.JVMController.endlessLoop(JVMController.java:30) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190) at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138) at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:105)通过jstack工具输入当初的线程栈,再通过grep命令联合上一步拿到的线程16进制的id定位到这个线程的运行状况,其中jstack前面的7268是第(1)步定位到的过程号,grep前面的是(2)、(3)步定位到的线程号。 从输入后果能够看到这个线程处于运行状态,在执行com.spareyaya.jvm.service.EndlessLoopService.service这个办法,代码行号是19行,这样就能够去到代码的19行,找到其所在的代码块,看看是不是处于循环中,这样就定位到了问题。 死锁死锁并没有第一种场景那么显著,web利用必定是多线程的程序,它服务于多个申请,程序产生死锁后,死锁的线程处于期待状态(WAITING或TIMED_WAITING),期待状态的线程不占用cpu,耗费的内存也很无限,而体现上可能是申请没法进行,最初超时了。在死锁状况不多的时候,这种状况不容易被发现。 能够应用jstack工具来查看 (1)jps查看java过程 [[email protected] ~]# jps -l8737 sun.tools.jps.Jps8682 jvm-0.0.1-SNAPSHOT.jar(2)jstack查看死锁问题 因为web利用往往会有很多工作线程,特地是在高并发的状况下线程数更多,于是这个命令的输入内容会非常多。jstack最大的益处就是会把产生死锁的信息(蕴含是什么线程产生的)输入到最初,所以咱们只须要看最初的内容就行了 Java stack information for the threads listed above:==================================================="Thread-4": at com.spareyaya.jvm.service.DeadLockService.service2(DeadLockService.java:35) - waiting to lock <0x00000000f5035ae0> (a java.lang.Object) - locked <0x00000000f5035af0> (a java.lang.Object) at com.spareyaya.jvm.controller.JVMController.lambda$deadLock$1(JVMController.java:41) at com.spareyaya.jvm.controller.JVMController$$Lambda$457/1776922136.run(Unknown Source) at java.lang.Thread.run(Thread.java:748)"Thread-3": at com.spareyaya.jvm.service.DeadLockService.service1(DeadLockService.java:27) - waiting to lock <0x00000000f5035af0> (a java.lang.Object) - locked <0x00000000f5035ae0> (a java.lang.Object) at com.spareyaya.jvm.controller.JVMController.lambda$deadLock$0(JVMController.java:37) at com.spareyaya.jvm.controller.JVMController$$Lambda$456/474286897.run(Unknown Source) at java.lang.Thread.run(Thread.java:748)Found 1 deadlock.发现了一个死锁,起因也高深莫测。 ...