java 堆栈分析
再次,研究了一个下午的jhat好jmap。从一开始惊呆、懵懂于那样大量而无聊乏味的数据,到现在有那么一点点收货。赶紧记录下来。没办法,悟性太低。。。
C:\Users\Administrator>jps Jps C:\Users\Administrator>jps Jps
HttpServer C:\Users\Administrator>jmap -dump:file=testJmapa
Dumping heap to C:\Users\Administrator\testJmapa ...
Heap dump file created C:\Users\Administrator>jhat testJmapa
Reading from testJmapa...
Dump file created Sat Jul :: CST
Snapshot read, resolving...
Resolving objects...
Chasing references, expect dots.
Eliminating duplicate references.
Snapshot resolved.
Started HTTP server on port
Server is ready.
jmap导出内存堆栈的。它能够导出java线程某个时刻的整个内存堆栈信息,记录了每一个类、属性、静态常量等等的信息, —— 唯独不包括类的方法等信息。
jhat 分析jmap导出的内存堆栈。实际上就是提供了一个静态的web server来供查询等等。
首页有:
All Classes (excluding platform)
Package test
class test.HttpServer [0x269bc990]
class test.HttpServer2 [0x269bc7d0]
class test.Test1234 [0x269bc618]
Other Queries
同时提供了oql 这么一种内置的查询语法。
参考http://blog.csdn.net/gtuu0123/article/details/6039474
同时有一些疑问:
1 当我通过jmap导出我一个tomcat 的web 应用的时候,遇到: The VM does not support the attach mechanism 不知道怎么回事
2 为什么会出现0 instances的情况?(在我这个例子中HttpServer继承HttpServe2继承Test1234,名字随便取的) 难道说,HttpServer创建的时候引用了HttpServer2和Test1234,所以它们会被加载而计算在All Classes中,但是又因为他们没有被创建实例出来,所以count为0 ?
Instance Counts for All Classes (excluding platform)
1instance of class test.HttpServer
0instances of class test.HttpServer2
0instances of class test.Test1234
3 Heap Histogram 和Instance Counts for All Classes (including platform) 什么区别? 后者包含更多的信息排序功能、count、total size(展现为table,如果把表格转换为‘直方’ chart的话,就是Histogram 了吧, 理解了Histogram 的含义,一切都好办),而前者只有count。
4 Show all members of the rootset 为什么这么多内容? 当然,这样问的话,显得幼稚。其实我的意思是,什么样的对象可以成为rootset ? 怎么静态资源会这么多? 为什么每个rootset的路径都那么短(可能是项目不够复杂的原因)? 为什么前两者有from、 而后面的没有from。。。(很好理解,因为静态资源的locale等是由别的类加载的、我们写的类多数是由Thread加载的,所以有from) 为什么jni、system的ClassLoader为null 其他的没有出现ClassLoader属性。。 为什么Java Local References出现了重复的:ServerSocket SocksSocketImpl ReferenceQueue 等出现2次。。。
Java Local References Java Local Reference (from java.lang.ref.Reference$ReferenceHandler@0x22960a38) :
--> java.lang.ref.Reference$ReferenceHandler@0x22960a38 ( bytes)
Java Local Reference (from java.lang.ref.Finalizer$FinalizerThread@0x22960b38) :
--> java.lang.ref.Finalizer$FinalizerThread@0x22960b38 ( bytes)
Java Local Reference (from java.lang.ref.Reference$ReferenceHandler@0x22960a38) :
--> java.lang.ref.Reference$Lock@0x22960a30 ( bytes)
Java Local Reference (from java.lang.Thread@0x22960790) :
--> test.HttpServer@0x229bfbd0 ( bytes)
Java Local Reference (from java.lang.Thread@0x22960790) :
--> [Ljava.lang.String;@0x229bfbc0 ( bytes)
Java Local Reference (from java.lang.Thread@0x22960790) :
--> java.net.ServerSocket@0x229bfe68 ( bytes)
Java Local Reference (from java.lang.Thread@0x22960790) :
--> test.HttpServer@0x229bfbd0 ( bytes)
Java Local Reference (from java.lang.Thread@0x22960790) :
--> java.net.Socket@0x229c1680 ( bytes)
Java Local Reference (from java.lang.Thread@0x22960790) :
--> java.net.ServerSocket@0x229bfe68 ( bytes)
Java Local Reference (from java.lang.Thread@0x22960790) :
--> java.net.SocksSocketImpl@0x229c16a0 ( bytes)
Java Local Reference (from java.lang.Thread@0x22960790) :
--> java.net.Socket@0x229c1680 ( bytes)
Java Local Reference (from java.lang.Thread@0x22960790) :
--> java.net.ServerSocket@0x229bfe68 ( bytes)
Java Local Reference (from java.lang.Thread@0x22960790) :
--> java.io.FileDescriptor@0x229c14d0 ( bytes)
Java Local Reference (from java.lang.Thread@0x22960790) :
--> java.net.SocksSocketImpl@0x229c16a0 ( bytes)
Java Local Reference (from java.lang.Thread@0x22960790) :
--> java.net.SocksSocketImpl@0x229c1410 ( bytes)
Java Local Reference (from java.lang.ref.Reference$ReferenceHandler@0x22960a38) :
--> java.lang.ref.Reference$Lock@0x22960a30 ( bytes)
Java Local Reference (from java.lang.ref.Finalizer$FinalizerThread@0x22960b38) :
--> java.lang.ref.ReferenceQueue@0x22960b10 ( bytes)
Java Local Reference (from java.lang.ref.Finalizer$FinalizerThread@0x22960b38) :
--> java.lang.ref.ReferenceQueue@0x22960b10 ( bytes)
Java Local Reference (from java.lang.ref.Finalizer$FinalizerThread@0x22960b38) :
--> java.lang.ref.ReferenceQueue$Lock@0x22960b28 ( bytes)
Java Static References 静态资源
Java Local References ———— 个人的项目代码产生的refs
Busy Monitor References
JNI Global References
JNI Local References
System Class References
—— 这样分类的根据是什么?Finalizer Summary 做什么用的? GC ? 总共出现了多个的ClassLoader呢? 有多个实例的对象,怎么判断它们是否由同一个ClassLoader加载的呢? 为什么非个人写的class的ClassLoader都是null呢?
总结
写了一个最简单的java程序
public class Test1234 {
public String aaa = "asfaf";
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
Thread.sleep();
}
}
发现,平台需要的类竟然都有
Total of 6476 instances occupying 504439 bytes.
1922instances of class [C
1473instances of class java.lang.String
738instances of class java.util.TreeMap$Entry
367instances of class java.lang.Class
333instances of class [Ljava.lang.Object;
199instances of class java.lang.StringBuilder
185instances of class [Ljava.lang.String;
138instances of class java.io.File
...
class [C | 1922 | 341440 |
class [B | 68 | 43618 |
class java.lang.Class | 367 | 27892 |
class java.lang.String | 1473 | 23568 |
class java.util.TreeMap$Entry | 738 | 15498 |
class [Ljava.lang.Object; | 333 | 12800 |
class [Ljava.lang.String; | 185 | 4812 |
同时发现Test1234的实例为0
0instances of class test.Test1234
表明它还未被实例化—— 虽然其main方法已经运行了,但是它没有被实例化,所以,其实例变量aaa也没有被创建:
执行oql :select s.value.toString() from java.lang.String s where /asfaf/(s.value.toString()) ,返回空
改成这样:
package test; public class Test1234 { public String aaa = "asfaf";
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
System.out.println(new Test1234().aaa);
Thread.sleep(); } }
保证了Test1234有被实例化(同时没有被回收),
1instance of class test.Test1234
再次执行上面的oql,有返回了,而且,String对象的个数为
1480instances of class java.lang.String
总实例对象个数发现变化:
Total of 6496 instances occupying 504334 bytes.
再改成 :
package test; public class Test1234 { public String aaa = "asfaf";
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
new Test1234().aaa = null;
Thread.sleep(); } }
发现:
1474instances of class java.lang.String
Total of 6479 instances occupying 504476 bytes.
执行同样的oql,发现还是有返回,说明,虽然aaa被赋值为null,但是还是没有被那么快的回收。。
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
关于oql
发现其实它也没什么太多作用,无非就是查询堆中类的发布、赋值情况, —— 可以查询登录密码是否包含其中有效的内存中,从而说明其密码没加密?
除此之外呢? 。。。
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
看了别的文章, 感觉还是Eclipse Memory Analyzer (Tool)(简称MAT)好用, 因为mat 是可视化的。。
Mat的优势,不仅仅在于其可视化,
http://chenxy.blog.51cto.com/729966/759221
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
带着问题学技术:
给你一个dump出来的bin文件,
1 如何分析出其当前最耗时间的方法调用,为什么花那么多时间
2 哪个方法调用的次数最多,为什么
3 哪个类最占资源—— 一般是String 或者 char[]/byte[],除次之外,要注意哪些类的count/size是非常大的—— 可能程序写的不好,就很占资源了。。
4 哪个线程最忙,最占时间,
5 哪个线程最频繁的被启停,就是说启动后执行很短时间,很快又结束
6 是否存在定时的任务线程
7 gc占用了多少时间
8 gc的影响
9 major gc 和minil gc的发生情况,为什么发生—— 是否有异常,换句话说,异常情况下gc是怎么样的
关于jvm:
1 具体有哪些后台线程,分别什么作用,是否可以去掉
2 各个进程的工作机制是什么。。
3 爱上
作为web程序
1 吞吐量如何—— 即处理request的能力(响应速度,返回时间,最大限制)怎么样
2 是否安全—— 是否经得起各种攻击。。
3 设计的是否足够好—— 是否容易维护
java 堆栈分析的更多相关文章
- java 堆栈分析3
很多方式,比如jconsole.jvisualvm,或者jstack -as 这样的形式, 都可以看到实时的java堆栈的变化: eden suvirried0 suvirried1 old perg ...
- 由一次线上故障来理解下 TCP 三握、四挥 & Java 堆栈分析到源码的探秘
本文导读: 生产故障场景介绍 TCP 建连三次握手过程 TCP 断连四次挥手过程 结合 Java 堆栈剖析源码 再从堆栈中找到"罪魁祸首" 问题优化方案总结 1.生产故障场景介绍 ...
- java 堆栈分析2
有了mat.同时我们发现Java有提供jvisualvm, jvisualvm是一个不错的工具: heap dump . thread dump. cpu/mem profile 无所不能. 不过观察 ...
- java 堆栈分析4
jprofiler ,又是一款好工具... —— 不过显然,我觉得有了jvisualvm就足够了,难道它会比jvisualvm还强大很多!?? 什么时候需要它呢?它有什么特别好用的地方吗? 带来什么方 ...
- 在线java堆栈分析工具
1:工具地址 https://gceasy.io/ft-dashboard-web.jsp 2:在线分析结果
- 【转】java线上程序排错经验2 - 线程堆栈分析
前言 在线上的程序中,我们可能经常会碰到程序卡死或者执行很慢的情况,这时候我们希望知道是代码哪里的问题,我们或许迫切希望得到代码运行到哪里了,是哪一步很慢,是否是进入了死循环,或者是否哪一段代码有问题 ...
- Java线程堆栈分析
不知觉间工作已有一年了,闲下来的时候总会思考下,作为一名Java程序员,不能一直停留在开发业务使用框架上面.老话说得好,机会是留给有准备的人的,因此,开始计划看一些Java底层一点的东西,尝试开始在学 ...
- Java问题定位之Java线程堆栈分析
采用Java开发的大型应用系统越来越大,越来越复杂,很多系统集成在一起,整个系统看起来像个黑盒子.系统运行遭遇问题(系统停止响应,运行越来越慢,或者性能低下,甚至系统宕掉),如何速度命中问题的根本原因 ...
- Java并发编程之程序运行堆栈分析
Java程序运行的堆栈分析 1.JVM运行时数据区 JVM通过加载class文件的数据来执行程序.JVM在运行时会划分不同的区域以存放数据.如下图所示: 线程共享部分:所有线程都能访问这块内存的数据, ...
随机推荐
- 【转】 71道经典Android面试题和答案,重要知识点都包含了
,,面试题1. 下列哪些语句关于内存回收的说明是正确的? (b ) A. 程序员必须创建一个线程来释放内存 B.内存回收程序负责释放无用内存 C.内存回收程序允许程序员直接释放内存 ...
- ifmodule
<IfModule> 指令 说明 封装指令并根据指定的模块是否启用为条件而决定是否进行处理 语法 <IfModule [!]module-file|module-id ...
- JS-offsetParent定位父节点
offsetParent:离当前元素最激动呢一个有定位的父节点 如果没有定位父级,默认是body IE7以下如果当前元素没有定位默认是body,如果有定位就是html IE7以下,如果当前元素的某个父 ...
- Java回调函数
维基百科上的定义:在计算机程序设计中,回调函数,或简称回调,是指通过函数参数传递到其它代码的,某一块可执行代码的引用.这一设计允许了底层代码调用在高层定义的子程序. 所谓回调,就是客户程序C调用服务程 ...
- 【线段树】bzoj3995 [SDOI2015]道路修建
线段树每个结点维护5个域: 整个区间的MST. 将两个左端点连通,两个右端点不连通,整个区间内选择2*(r-l+1)-2条边的最小生成森林,有两个连通块. 将两个右端点连通,两个左端点不连通,整个区间 ...
- C# JS 单例
单例模式的三个特点: 1,该类只有一个实例 2,该类自行创建该实例(在该类内部创建自身的实例对象) 3,向整个系统公开这个实例接口 模式1: class Singleton { //私有,静态的类自身 ...
- springboot使用之二:整合mybatis(xml方式)并添加PageHelper插件
整合mybatis实在前面项目的基础上进行的,前面项目具体整合请参照springboot使用之一. 一.整合mybatis 整合mybatis的时候可以从mybatis官网下载mybatis官网整合的 ...
- JAVA里面的IO流(一)分类2(节点流和处理流及构造方法概要)
IO流根据处理对象的不同分为节点流和处理流. 直接对文件进行处理的流为节点流: 对流进行包装从而实现对文件的优化处理的流为处理流. 节点流类型: 可以看出,节点流主要分这几大类: 文件流 文件流构造方 ...
- Asp.Net异步编程-使用了异步,性能就提升了吗?
Asp.Net异步编程 写在前面的话,很久没有写Blog了,不对,其实一致就没有怎么写过.今天有空,我也来写一篇Blog 随着.Net4.5的推出,一种新的编程方式简化了异步编程,在网上时不时的也看到 ...
- R语言数据处理利器——dplyr简介
dplyr是由Hadley Wickham主持开发和维护的一个主要针对数据框快速计算.整合的函数包,同时提供一些常用函数的高速写法以及几个开源数据库的连接.此包是plyr包的深化功能包,其名字中的字母 ...