2010-05-11 115 views
7

在工作中,我们发现在某些情况下(特别是缓慢的情况下),我们有不同的行为,在重启时获得。我们可以查看JVM内存中的对象吗?

我们猜测一个缓存没有被正确初始化,或者是一个并发问题...... 无论如何,它在任何其他环境中都不能再生产。

我们居然没有记录器激活...这是一个旧的组件...

因此,我想知道是否有工具,可以帮助我们看到存在于不同OBJETS JVM内存以检查缓存内容...

谢谢!

编辑:

我没有访问生产服务器直接,我们的应用程序服务器的WebLogic 10,我没有一个指向对象的指针,但我知道缓存对象类型.. 。

EDIT2:

我们的服务器上JRE 1.5上运行,是有可能使用JMAP?在JDK5无法找到它:( 此外,远程调试可能是好的,但我们不能出于安全考虑......

EDIT3:

其实+与jHat VisualVM的是确定对我来说,我发现我的对象在转储中,但我无法正确读取hashmap(包含大约60000项的对象)... 是否有工具以友好的方式读取同时发生的映射?我需要找到一个键的值(或其在地图中的存在),而没有手动浏览60k记录 其实我在eclipse MAT论坛上读到它也不可能用它...

编辑4: 经过一些经验,我真的很喜欢像VisualVM这样的工具。也使用YourKit。 有一些有用的功能,如OQL找到您需要查看的正确实例...

+0

我不知道如何在没有某种指针/变量引用的情况下访问对象。 – aperkins 2010-05-11 17:32:37

回答

6

这基本上是要扩大将会说什么。 通过让我们的管理员完成生产系统的堆积,我获得了巨大的成功,但要注意的是,要转储的特定服务器在转储完成之前将无法响应。然后获取该文件并使用Eclipse MAT插件查看它。如果你不喜欢Eclipse,也可以使用Netbeans和普通的VisualVM插件。尽管这可以创建一些大文件,但您可能需要在64位系统上运行。

+1

VisualVM的+1 – ykaganovich 2010-05-11 20:11:02

+0

适用于Eclipse MAT的+1 - 这是最强大的(免费)堆可视化工具。强烈推荐,并有令人敬畏的插件以有趣的方式查看堆(例如收集填充%!)。 – 2010-05-12 02:04:45

3

您是否有权访问对象的句柄/指针?如果是这样,你可以在调试模式下启动它,并在像Eclipse这样的调试器中查看它。这将允许你检查变量等。

或者,您可以编写一个反射式浏览该类的日志记录器,并记录发生了什么。所有这些都假定您有一个位置,您可以开始进入代码,或者获取对缓存值的引用。


编辑:正如我在我的评论指出,我不知道的一种方式来获得访问某个对象没有某种形式的引用或引用链接。例如,对象是否封装在另一个对象中?如果是这样,你可以这样做以下:

Class<?> objectClass = myPointer.getClass(); 
Field[] objectFields = objectClass.getDeclaredFields(); 
for (Field field : objectFields) { 
    field.setAccessible(true); 
    //Or whatever you would need to do to get the information you need 
    System.out.println(field.get(myPointer).toString()); 
} 

你也可以这样做:

Field targetField = objectClass.getDeclaredField("myFieldName"); 
targetField.setAccessible(true); 
MyOldObjectType target = (MyOldObjectType)targetField.get(myPointer); 
//do whatever you need to do here 

注意,所有的反射方法抛出异常,所以你将需要处理那些为适当。另外,setAccessible(true)表示您可以访问对象上的私有字段和方法。这是EXTREMELY DANGEROUS - 只有在绝对必要时才使用它。

+0

我不认为像Eclipse中那样的调试器是一种选择,因为“它在任何其他环境中都不能再生产”。 – 2010-05-11 17:20:26

+1

@Andrew Hubbs:我在生产环境中亲自使用了Eclipse调试 - 您必须以调试模式启动系统,并将其设置为远程连接。那里有选项 - 这并不容易,但它是可能的。 – aperkins 2010-05-11 17:21:43

+0

我们的服务器不在同一个城市,我不知道他们是否可以在调试模式下启动生产weblogic,也不知道他们是否允许我通过隧道访问... – 2010-05-11 17:42:00

4

它很容易运行JMAP抛售对象实例的计数,但我不知道如果这就是你真正感兴趣的。

您还可以使用JMAP做的堆转储整个堆,并与那个(和jhat),你可以看到对象的关系(即什么对象指向什么),但不一定是对象内容。

当然,数据在堆转储中存在,它不会“点击”可见。

我认为一些专业配置文件将允许您在堆转储中反思对象。

不然的话,您最好还是在应用程序中添加一些特定的检测工具,以提供您要查找的特定内省,由自定义代码,JMX或其他类型触发。

+0

+1 - 我不知道堆转储。那对我来说会在一两个月前真正有用:) – aperkins 2010-05-11 17:42:30

+0

我们使用java 1.5 是否可以在1.5 jre上使用jmap?我只在jdk6上发现了jmap,并且无法使用我的本地jre 1.5 ... – 2010-05-11 19:00:04

相关问题