Archives
-
理解Heap Profling名词-Shallow和Retained Sizes
所有包含Heap Profling功能的工具(MAT, Yourkit, JProfiler, TPTP等)都会使用到两个名词,一个是Shallow Size,另一个是 Retained Size.
这是两个在平时不太常见的名词,本文会对这两个名词做一个详细的解释。Shallow Size
对象自身占用的内存大小,不包括它引用的对象。
针对非数组类型的对象,它的大小就是对象与它所有的成员变量大小的总和。当然这里面还会包括一些java语言特性的数据存储单元。
针对数组类型的对象,它的大小是数组元素对象的大小总和。Retained Size
Retained Size=当前对象大小+当前对象可直接或间接引用到的对象的大小总和。(间接引用的含义:A->B->C, C就是间接引用)
换句话说,Retained Size就是当前对象被GC后,从Heap上总共能释放掉的内存。
不过,释放的时候还要排除被GC Roots直接或间接引用的对象。他们暂时不会被被当做Garbage。看图理解Retained Size

上图中,GC Roots直接引用了A和B两个对象。A对象的Retained Size=A对象的Shallow Size
B对象的Retained Size=B对象的Shallow Size + C对象的Shallow Size这里不包括D对象,因为D对象被GC Roots直接引用。
如果GC Roots不引用D对象呢?

此时,
B对象的Retained Size=B对象的Shallow Size + C对象的Shallow Size + D对象的Shallow Size2011/03/28 | Posted in JVM -
JVMTI开发教程之带引用关系的class柱状图
在第一节中介绍了如何搭建JVMTI开发环境,并实现了一个简单的打印所有已装载class签名的agent。
在第二节中介绍了如何使用Heap系API来实现一个打印Class统计信息柱状图的小工具。本节将在第二节基础上做一些增强,实现一个带引用关系的Class统计信息柱状图。
OK,我们先来看下上一节中的显示效果和本节例子的最终显示效果的异同:
上图是上一节中例子中的显示效果。

上图是本节例子中的最终显示效果。可以看到,我们不仅可以获知某个class的实例数量,实例的总占用空间,以及class name。还能观察到class及其整棵引用树上的class的实例数量,空间,name等。
Read more…2011/03/17 | Posted in JVM -
关于增强visualvm的一些想法
visualvm是jdk里自带的一款比较实用的可视化profiling工具。
想法1:远程连接通过ssh隧道穿透隔离网络访问生产环境
java有处理ssh协议的第三方包,ssh隧道只要对端安装有openssh server都能搞定。
所以,只需要开发一个visualvm的新远程连接插件,即可穿透隔离网络在visualvm的可视化界面下,profling生产环境主机。当然,安全性和权限需要同时考虑。
Read more…2011/03/16 | Posted in JVM -
JVMTI开发教程之Class统计信息柱状图
在 JVMTI开发教程之一个简单的Agent 一文中介绍了如何搭建JVMTI开发环境,并实现了一个简单的打印所有已装载class签名的agent。
本文将主要介绍JVMTI的Heap系API,并利用这些API,实现一个类似 jmap -histo 的Class统计信息柱状图。

在上图中,我们可以获知某个class的实例数量,实例的总占用空间,以及class name。所用到的JVMTI Heap系API介绍
注意:下文中提及的函数定义,均以C++版作为参照。
Get/SetTag
函数定义如下:jvmtiError GetTag(jobject object, jlong* tag_ptr) jvmtiError SetTag(jobject object, jlong tag)
标签用于与某一个对象建立关联。之后,可通过标签来查找对象。
SetTag为对象添加标签,GetTag获取对象上的标签。
标签在Heap系API中得到了广泛使用。
Read more…2011/03/16 | Posted in JVM -
JVMTI开发教程之一个简单的Agent
概述
JVM TI是JDK提供的一套用于开发JVM监控, 问题定位与性能调优工具的通用编程接口(API)。
通过JVMTI,我们可以开发各式各样的JVMTI Agent。这个Agent的表现形式是一个以c/c++语言编写的动态共享库。JVMTI Agent原理: java启动或运行时,动态加载一个外部基于JVM TI编写的dynamic module到Java进程内,然后触发JVM源生线程Attach Listener来执行这个dynamic module的回调函数。在函数体内,你可以获取各种各样的VM级信息,注册感兴趣的VM事件,甚至控制VM的行为。
JVMTI从功能上大致可以分为4类:
Read more…2011/03/14 | Posted in JVM -
剖析一个java对象初始化顺序问题
今天我在Dzone阅读了一篇关于java对象实例初始化顺序的有趣文章。说它有趣,是因为作者使用了一种并不太推荐的编码风格,只有用这种编码风格才能触发这个极为少见的 Java object initialization order 问题。
其实java对象初始化顺序算是一个比较基础的java知识点。但是网上的文章多半描述不清,使用上一不小心就容易出问题。
所以在本文中,我想结合JLS和自己的理解,举例剖析问题的所在。OK,我们先来看个模仿Dzone作者原意的简单例子:
2010/07/21 | Posted in JVM -
Java Reference概念整理,初级
Share with you.
Strong Reference, 强引用,即java标准的引用方式,表示GC从 Root Set 开始向下扫描,可以找到对应的 Strong Reference。
Referent,被包装为 Weak, Soft, Phantom Reference的对象引用称之为 referent。后面的内容会多次提到这个名词。
Weak Reference, 弱引用。当一个referent,在运行时没有同时被强,软引用,只被Weak Reference自身引用,且Weak Reference从 Root Set 可达,则该referent会被GC回收。
WR的作用,一般是为referent提供一个被回收的凭据,结合ReferenceQueue可以让程序在第一时间得到referent被回收的事件,从而做一些额外的clean操作。(如果对ReferenceQueue作用和回调感兴趣,可以先看最下面的 ReferenceQueue 简介)
2010/05/20 | Posted in JVM