xml地图|网站地图|网站标签 [设为首页] [加入收藏]

小命令保证大性能

来源:http://www.ccidsi.com 作者:集成介绍 人气:183 发布时间:2020-03-13
摘要:在命令行输入: 四、别的命令 GC overhead limt exceed检查是Hotspot VM1.6概念的三个国策,通过总括GC时间来预测是不是要OOM了,提前抛出十三分,幸免OOM产生。Sun官方对此的概念是:“并行

在命令行输入:

四、别的命令

GC overhead limt exceed检查是Hotspot VM 1.6概念的三个国策,通过总括GC时间来预测是不是要OOM了,提前抛出十三分,幸免OOM产生。Sun 官方对此的概念是:“并行/并发回笼器在GC回笼时间过长时会抛出OutOfMemroyError。过长的定义是,当先98%的时光用来做GC並且回笼了不到2%的堆内部存款和储蓄器。用来制止内部存储器过小导致接收不可能健康办事。

thread dump:

thread dump文件重大保存的是java应用中各线程在某一每日的运营的职位,即进行到哪三个类的哪贰个措施哪叁个行上。
thread dump是二个文书文件,打开后得以见见每三个线程的执行栈,以stacktrace的不二法门体现。
透过对thread dump的剖判能够博得利用是或不是“卡”在某一点上,即在某一点运转的光阴太长,如数据库查询,长时间得不到响应,最后招致系统崩溃。
单个的thread dump文件常常的话是不曾什么样用场的,因为它只是记录了某二个万万时间点的图景。
相比较平价的是,线程在多个时刻段内的执生势况。

多少个thread dump文件在言之有序时特意有效,困为它能够见到在程序五个日子点上,线程实施的任务,若是开掘前后相继两组数据中同一线程都实施在平等地点,则证实此处大概至极,因为程序运营是一点也不慢的,假设一次均在某一点上,表达那或多或少的耗费时间是相当的大的。
因而对那三个文件进行分析,查出原因,进而缓和问题。

4、难点应用方案

pidstat监察和控制CPU常用展现字段内容如下:
PID - 被监控的任务的进程号
%usr - 当在用户层执行(应用程序)时这个任务的cpu使用率,和 nice 优先级无关。注意这个字段计算的cpu时间不包括在虚拟处理器中花去的时间。
%system - 这个任务在系统层使用时的cpu使用率。
%guest - 任务花费在虚拟机上的cpu使用率(运行在虚拟处理器)。
%CPU - 任务总的cpu使用率。在SMP环境(多处理器)中,如果在命令行中输入-I参数的话,cpu使用率会除以你的cpu数量。
CPU - 正在运行这个任务的处理器编号。
Command - 这个任务的命令名称

运作命令突显如下图所示:

三、获取及解析 thread dump

注:那是一段测验代码通过sleep方法举办延时,在程序运营进度中极慢,我想驾驭终归是哪段程序影响的完全质量呢?

5.2、使用eclipse MAT工具

http://www.eclipse.org/mat/

相同的话,应用程序的dump文件都以极大的,jdk自带命令难以剖析这一个大文件。
在实际的生育碰到下,大家不得不要依靠第三方工具,能力快速展开那几个大文件,进行深入分析稳固。
eclipse memory analyzer是一款不错的heap剖判工具,能够帮我们极快牢固内部存款和储蓄器败露难题。

3、DUMP文件分析将dump文件导入VisualVM工具中,如下图所示:

3、hprof

hprof不是单独的监察和控制工具,它只是二个java agent工具,
它能够用在监察和控制Java应用程序在运营时的CPU新闻和堆内容,
使用 java -agentlib:hprof=help 命令能够查阅hprof的使用文书档案。

例如

java -agentlib:hprof=cpu=times,interval=10 -jar myJar
# 含义
# times:java函数的执行时间
# hprof=cpu是针对cpu统计时间
# interval=10 采样10次 

# 运行完成之后在工程目录里面,还多了一个文本文件java.hprof.txt
# 其内容类似如下:
CPU TIME (ms) BEGIN (total = 11542) Fri Jul 22 11:00:34 2016
rank   self  accum   count trace method
   1 86.65% 86.65%       1 303422 com.test.HProfTest.slowerMethod
   2  8.66% 95.31%       1 303423 com.test.HProfTest.slowMethod
   3  0.25% 95.56%      36 300745 java.util.zip.ZipFile.<init>
   4  0.20% 95.76%      36 300434 java.lang.String.equals
   5  0.13% 95.89%      14 301138 java.net.URLStreamHandler.parseURL
   6  0.11% 96.01%       6 301339 java.net.URLClassLoader$1.run
   7  0.10% 96.10%      14 301124 java.lang.String.<init>
   8  0.09% 96.19%    3407 300355 java.lang.String.charAt
   9  0.08% 96.27%      36 300443 java.io.UnixFileSystem.normalize

从 self 列基本可以看出来哪个类的方法执行时间长,耗费了CPU时间,一目了然,方便我们快速定位问题

重国民党的新生活运动行这段程序展现如下图:

一.dump基本概念

在故障定位(特别是out of memory卡塔尔和性质分析的时候,日常会用到有个别文件来增派大家肃清代码难点。
那个文件记录了JVM运维时期的内存占用、线程推行等气象,那正是大家常说的dump文件。
常用的有 heap dumpthread dump(也叫javacore,或java dump)。
咱俩得以这么通晓:heap dump 记录内部存款和储蓄器音信的,thread dump 是记录CPU信息的。

当时还发今后工程目录里面,多了贰个文书文件java.hprof.txt,如下图所示:

2、JConsole、VisualVM、MAT 等别的工具

jstack -l 843 > /tmp/testlog.txt

4、让JVM在有些一定事件时有发生的时候自动做heap dump

突发性我们只想在产生OutOfMemoryError的时候让JVM自动生成二个heap dump出来,以便工作后剖析。
这种时候设置运营参数 -XX: HeapDumpOnOutOfMemoryError 即可

CPU TIME  BEGIN (total = 11542) Fri Jul 22 11:00:34 2016rank self accum count trace method 1 86.65% 86.65% 1 303422 com.test.HProfTest.slowerMethod 2 8.66% 95.31% 1 303423 com.test.HProfTest.slowMethod 3 0.25% 95.56% 36 300745 java.util.zip.ZipFile.<init> 4 0.20% 95.76% 36 300434 java.lang.String.equals 5 0.13% 95.89% 14 301138 java.net.URLStreamHandler.parseURL 6 0.11% 96.01% 6 301339 java.net.URLClassLoader$1.run 7 0.10% 96.10% 14 301124 java.lang.String.<init> 8 0.09% 96.19% 3407 300355 java.lang.String.charAt 9 0.08% 96.27% 36 300443 java.io.UnixFileSystem.normalize

二、获取及解析 heap dump

"Thread-0" prio=10 tid=0x00007f7d90103800 nid=0x357 runnable [0x00007f7d943d5000] java.lang.Thread.State: RUNNABLE at PidstatTest$PidstatTask.run(PidstatTest.java:13) at java.lang.Thread.run(Thread.java:722) Locked ownable synchronizers: - None
pidstat监察和控制IO常用的字段展现内容如下:
kB_rd/s - 任务从硬盘上的读取速度(kb)
kB_wr/s - 任务向硬盘中的写入速度(kb)
kB_ccwr/s - 任务写入磁盘被取消的速率(kb)

注:那是一段测验用的java程序,将其运行起来。

5.1、使用JDK自带的jhat命令

jhat是用来深入分析java堆的命令,能够将堆中的对象以html的样式显示出来,包罗对象的数额,大小等等,并协理对象查询语言

# 端口号默认为7000
jhat -port 5000 <filename>

# 如果映像文件很大,你要指定一个很大的Xmx值,否则在分析过程中就会有OutOfMemeryError的错误。
jhat -J-Xmx2048m heap.dmp

2、命令的现实性讲明hprof不是独自的督察工具,它只是八个java agent工具,它能够用在监察和控制Java应用程序在运作时的CPU音讯和堆内容,使用java -agentlib:hprof=help一声令下能够查看hprof的利用文书档案。

heap dump:

heap dump文件是三个二进制文件,它保存了某一时时JVM堆中指标使用景况。
HeapDump文件是指准时刻的Java旅社的快速照相,是一种镜像文件。
Heap Analyzer工具通过解析HeapDump文件,哪些对象占用了太多的饭馆空间,来发掘产生内部存款和储蓄器走漏只怕恐怕引起内存泄露的靶子。

/** * PROJECT_NAME: test * DATE: 16/7/22 * CREATE BY: chao.cheng **/public class PidstatTest { public static class PidstatTask implements Runnable { public void run() { while { double value = Math.random() * Math.random(); } } } public static class LazyTask implements Runnable { public void run() { try { while  { Thread.sleep; } } catch (Exception e) { e.printStackTrace(); } } } public static void main(String[] args) { new Thread(new PidstatTask.start(); new Thread(new LazyTask.start(); new Thread(new LazyTask.start(); }}
pidstat 使用
# -u:代表对cpu使用率的监控
# 参数1 3:表示每秒采样一次,一共三次
# -t:将监控级别细化到线程 
pidstat -p 843 1 3 -u -t

运作命令呈现雷同于下图所示:

图片 1

image

个中 TID便是线程ID,%usr表示顾客线程使用率
从图中得以看见 855 这么些线程CPU占用相当的高。

再接受 jstack 命令导出 thread dump 新闻:

jstack -l 843 > /tmp/testlog.txt

翻看testlog.txt彰显如下一些剧情:

图片 2

image

小编们关怀的是日记文件的NID字段,它对应的便是我们地点说的TID,
NID是TID的16进制表示,将下边包车型地铁十进制855调换来十七进制为357,
在日记中开展查找见到如下内容:

"Thread-0" prio=10 tid=0x00007f7d90103800 nid=0x357 runnable [0x00007f7d943d5000]
   java.lang.Thread.State: RUNNABLE
    at PidstatTest$PidstatTask.run(PidstatTest.java:13)
    at java.lang.Thread.run(Thread.java:722)

   Locked ownable synchronizers:
    - None

其一能够想见出有品质瓶颈的程序点。

事例程序:

4、pidstat

pidstat是多少个功能特别强盛的性子监测工具,他是sysstat ( yum install sysstat 卡塔尔国的零件之一。
本条命令的有力之处在于不只能够监督进度的性子景况,也能够监察和控制线程的属个性状。

能够看来当堆中的对象不只怕被收回的时候,就提前遇警示出如此的荒诞,那时候内部存款和储蓄器并未溢出,那个特性在JDK中是默许加多的。

1、jmap (最常用的用法卡塔尔(قطر‎

jmap能够在别的时候总是到多少个跑在HotSpot VM的Java进度上,依据要求创设HPROF格式的heap dump。

jmap -dump:format=b,file=<filename> <pid>

# 如果我们只需要将dump中存活的对象导出,那么可以使用:live参数
jmap -dump:live,format=b,file=<filename> <pid>

还是能够在运行参数里丰硕 -XX: HeapDumpOnCtrlBreak ,然后经过ctrl break抑或发送SIGQUIT信号
让VM生成heap dump。

其一hprof小工具,特别有助于大家在用JUnit自测代码的时候组成使用,不只能够解决职业上的BUG,又能够在早晚程序上减轻可窥见的性责难点,特别实用。

2、jstat

这是jdk命令中比较根本,也是优异实用的一个限令,能够考查到classloader,compiler,gc相关音讯。
实际参数自行查看 jstat -help

1、示例演示事例程序:

5、分析 heap jump 文件

剧情如下:

1、jinfo

能够用来查阅正在运作的Java应用程序的强盛参数,以至帮衬在运作时,改善部分参数。

-flag <name> pid:打印指定JVM的参数值 
-flag [ |-]<name> pid:设置指定JVM参数的布尔值
-flag <name>=<value> pid:设置指定JVM参数的值

在docker容器中运转 jinfo/jmap 时出错

Error attaching to process: sun.jvm.hotspot.debugger.DebuggerException: Can't attach to the process: ptrace(PTRACE_ATTACH, ..) failed for 405: Operation not permitted
sun.jvm.hotspot.debugger.DebuggerException: sun.jvm.hotspot.debugger.DebuggerException: Can't attach to the process: ptrace(PTRACE_ATTACH, ..) failed for 405: Operation not permitted

找了一个减轻方案,正是接受 nsenter

# 安装nsenter
docker run --rm -v /usr/local/bin:/target jpetazzo/nsenter
# 或者
docker run --rm jpetazzo/nsenter cat /nsenter > /tmp/nsenter && chmod  x /tmp/nsenter

# 使用nsenter
# 首先找到 容器id对应的PID
PID=$(docker inspect --format {{.State.Pid}} <container_name_or_ID>)
# 然后使用 nsenter 进入到容器内部
nsenter --target $PID --mount --uts --ipc --net --pid

# 它还提供了一个 docker-enter 脚本,可以直接进入指定容器id
docker-enter my_awesome_container ls -la

pidstat监察和控制cpu常用显示字段内容如下:

1、jstack

jstack $(pid) > thread.txt

jstack的出口解释

"http-8080-10" daemon prio=10 tid=x0a949bb60 nid=0x884  waiting for monitor entry [...]

"http-8080-10" 那些线程处于等候意况。
waiting for monitor entry 要是在接连三次输出线程客栈音信都留存于同一个或多个线程上时,则表达系统中有锁角逐激烈,死锁,或锁饿死的想像。

“http-8080-11” daemon prio=10 tix=xxx nid=xxx in object.wait() [...]
 java.lang.Thread.State:waiting (on object monitor)

该表示http-8080-11的线程处于指标的Wait 上,等待其余线程的提醒,那也是线程池的遍布用法。

“Low Memory Detector”daemon prio=10 tix=xx nid=xxx runnable [...] 
java.lang.Thread.State:runnable

代表“Low Memory Detector” 的线程处于Runable状态,等待获取CPU的运用权.

仍可以查看Pid文件获取一些新闻

/proc/18225/status
/proc/18225/io

经过上海教室能够见见那么些工具拾分苍劲,能够总括的事物重重,上面的事例总结的是cpu时间,同样大家还足以总括内部存款和储蓄器占用的dump音讯。如:-agentlib:hprof=heap,format=b,file=/test.hprof

3、JMX的API

注:透过地点内容能够观察,哪个类的点子施行时间长,费用了cpu时间,一览无遗,方便大家急迅定位难题。

1、示例演示

图片 3Paste_Image.png注:其实中TID正是线程ID,%usr代表客户线程使用率,从图中能够见见855那么些线程占用cpu特别的高。

2、理论协理咱俩先解释一下什么是GC overhead limit exceeded错误。

本文由68399皇家赌场发布于集成介绍,转载请注明出处:小命令保证大性能

关键词: 68399皇家赌场 java 系列 性能 命令

最火资讯