线上load高的问题排查步骤是:
- 先用top找到耗资源的进程
- ps+grep找到对应的java进程/线程
- jstack分析哪些线程阻塞了,阻塞在哪里
- jstat看看FullGC频率
- jmap看看有没有内存泄露
使用jstack查看的例子:
C:\Users\Iammeaz>jstack 4696
2016-01-08 10:26:06
Full thread dump Java HotSpot(TM) 64-Bit Server VM (11.3-b02 mixed mode):
"Low Memory Detector" daemon prio=6 tid=0x000000006a63f800 nid=0x1790 runnable [0x0000000000000000..0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"CompilerThread1" daemon prio=10 tid=0x000000006a63a400 nid=0x1780 waiting on condition [0x0000000000000000..0x000000006
java.lang.Thread.State: RUNNABLE
"CompilerThread0" daemon prio=10 tid=0x000000006a62d000 nid=0x136c waiting on condition [0x0000000000000000..0x000000000
java.lang.Thread.State: RUNNABLE
"JDWP Command Reader" daemon prio=6 tid=0x000000006a612c00 nid=0x13c0 runnable [0x0000000000000000..0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"JDWP Event Helper Thread" daemon prio=6 tid=0x000000006a612000 nid=0x1bf4 runnable [0x0000000000000000..0x0000000000000
java.lang.Thread.State: RUNNABLE
"JDWP Transport Listener: dt_socket" daemon prio=6 tid=0x000000006a60b000 nid=0x1be0 runnable [0x0000000000000000..0x000
java.lang.Thread.State: RUNNABLE
"Attach Listener" daemon prio=10 tid=0x000000006a5f7c00 nid=0x1340 waiting on condition [0x0000000000000000..0x000000000
java.lang.Thread.State: RUNNABLE
"Signal Dispatcher" daemon prio=10 tid=0x000000006a5a5800 nid=0x11e0 runnable [0x0000000000000000..0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"Finalizer" daemon prio=8 tid=0x000000006a594000 nid=0x13c4 in Object.wait() [0x000000006a9ef000..0x000000006a9ef890]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x000000004a071210> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:116)
- locked <0x000000004a071210> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:132)
at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:159)
"Reference Handler" daemon prio=10 tid=0x000000006a593400 nid=0x1598 in Object.wait() [0x000000006a8ef000..0x000000006a8
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x000000004a071078> (a java.lang.ref.Reference$Lock)
at java.lang.Object.wait(Object.java:485)
at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:116)
- locked <0x000000004a071078> (a java.lang.ref.Reference$Lock)
"main" prio=6 tid=0x000000000062c800 nid=0x1190 at breakpoint[0x00000000025bf000..0x00000000025bfc50]
java.lang.Thread.State: RUNNABLE
at com.damonzh.maxsubseqsum.Demo01.MaxSubseqSum1(Demo01.java:15)
at com.damonzh.maxsubseqsum.Demo01.main(Demo01.java:7)
"VM Thread" prio=10 tid=0x0000000000525000 nid=0x14cc runnable
"GC task thread#0 (ParallelGC)" prio=6 tid=0x0000000000471400 nid=0x105c runnable
"GC task thread#1 (ParallelGC)" prio=6 tid=0x0000000000472800 nid=0xe94 runnable
"GC task thread#2 (ParallelGC)" prio=6 tid=0x0000000000474000 nid=0x180c runnable
"GC task thread#3 (ParallelGC)" prio=6 tid=0x0000000000475400 nid=0xe14 runnable
"VM Periodic Task Thread" prio=10 tid=0x000000000046d400 nid=0x494 waiting on condition
JNI global references: 1062
但这个还不是重点,那么问题来了(blue fly is the strongest):这些工具如何能获取远程Java进程的信息的?又是如何远程控制Java进程的运行的?
相信有不少人和我一样对这些工具的 实现原理 。
Java调试体系JPDA
Java虚拟机设计了专门的API接口供调试和监控虚拟机使用,被称为Java平台调试体系即Java Platform Debugger Architecture(JPDA)。
- java调试一
Eclipse 平台的特色在于内置了 Java 调试器,该调试器提供所有标准调试功能,包括进行单步执行.设置断点和值.检查变量和值以及暂挂和恢复线程的能力.Eclipse 平台工作台(Eclipse ...
- Java调试那点事[转]
转自云栖社区:https://yq.aliyun.com/articles/56?spm=5176.100239.blogcont59193.11.jOh3ZG# 摘要: 该文章来自于阿里巴巴技术协会 ...
- 深入 Java 调试体系: 第 1 部分,初探JPDA 体系
JPDA(Java Platform Debugger Architecture)是 Java 平台调试体系结构的缩写,通过 JPDA 提供的 API,开发人员可以方便灵活的搭建 Java 调试应用程 ...
- java调试器
javac.exe是编译.java文件 java.exe是执行编译好的.class文件 javadoc.exe是生成Java说明文档 jdb.exe是Java调试器 javaprof.exe是剖析工具 ...
- Java调试平台体系JPDA
Java 平台调试体系(Java Platform Debugger Architecture,JPDA)定义了一个完整独立的体系,它由三个相对独立的层次共同组成,而且规定了它们三者之间的交互方式,或 ...
- 深入 Java 调试体系: 第 1 部分,JPDA 体系概览
JPDA 概述 所有的程序员都会遇到 bug,对于运行态的错误,我们往往需要一些方法来观察和测试运行态中的环境.在 Java 程序中,最简单的,您是否尝试过使用 System.out.println( ...
- Eclipse Java 调试基本技巧
前言 这一部分是Eclipse中最为重要的部分.调试的重要性想必大家都清楚. 调试无疑是做项目最苦比的事情,但优秀的编码习惯,良好的调试方式能让这没那么苦,甚至还有点乐趣:). 本文讲解使用Eclip ...
- java调试技能之dubbo调试 ---telnet
dubbo作为一个远程调用框架,虽与同类型的框架,不知道谁优谁劣,但是就公司层面使用来说,还是很棒的.这里简单的写一下怎么使用和调试技巧,就算是作个使用总结吧,供快速使用和问题解决! dubbo是基于 ...
- java调试与排错
参考网址:http://www.doc88.com/p-461115156632.html 一.Java程序调试与错误收集 1.Web程序的调试与排错:尽量使用System.out.println() ...
随机推荐
- JAVA 一个或多个空格分割字符串
知识补充 String的split方法支持正则表达式: 正则表达式\s表示匹配任何空白字符,+表示匹配一次或多次. 有了以上补充知识,下面的内容就很好理解了. 一.待分割字符串 待分割字符串为如下: ...
- iOS推送后页面跳转
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launc ...
- Android高工必备技能
转载:http://www.jianshu.com/p/d791bbede02c Step 1. 玩转RxJava 使用RxJava处理异步极其方便,各种操作符可以对数据做流水线式操作,再加上与Ret ...
- linux中/和/root(~) 和 /home
winodws是森林型目录结构,它有很多根,如C.D.E.F等都是它的根目录,然后在其实创建子目录linux是树型目录结构,它只有一个根就是/目录,然后在/目录在有子目录如/root./home./e ...
- 【bzoj2038】 小Z的袜子(hose)
http://www.lydsy.com/JudgeOnline/problem.php?id=2038 (题目链接) 转自:http://blog.csdn.net/bossup/article/d ...
- Linux学习路线
为什么要学习Linux? 为什么学Linux,每个人都有自己的理由: Linux是免费的不用花一分钱,能够节约大笔的成本: Linux是开源的,你可以根据自已的需要修改源代码: Linux是开放的,有 ...
- Compiler Theory(编译原理)、词法/语法/AST/中间代码优化在Webshell检测上的应用
catalog . 引论 . 构建一个编译器的相关科学 . 程序设计语言基础 . 一个简单的语法制导翻译器 . 简单表达式的翻译器(源代码示例) . 词法分析 . 生成中间代码 . 词法分析器的实现 ...
- BackGroundWorker控件的使用注意
该控件有三个事件: DoWork .ProgressChanged 和 RunWorkerCompleted 在程序中调用RunWorkerAsync方法则会启动DoWork事件的事件处理,当在事件处 ...
- POJ3273 Monthly Expense
查看原题 边界,就是边界和思维,怎么有效的判断中间值是大了还是小了,以及准确的找到边界!一个<写成<=就前功尽弃,还特别难找到错误! #include <cstdio> #in ...
- iOS 简单的动画自定义方法(旋转、移动、闪烁等)
#define kDegreesToRadian(x) (M_PI * (x) / 180.0) #define kRadianToDegrees(radian) (radian*180.0)/(M_ ...