- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的问题相当简短:
如果我使用 VisualVM 找到两个对象,我可以执行哪种 OQL 查询来查找对这两个对象具有(间接)可达性或引用的所有对象?
新山更新:
编辑代码后,我得出以下结论:
//QUERY SCRIPT: find object that (indirectly) references to all target objects
//list all objects that the objects we search for should (indirectly) refer to
var targetObjects = [ heap.findObject("811819664"), //eg. obj that contains a player's health
heap.findObject("811820024") //eg. obj that contains the same player's name
];
//list all objects here that every or most objects have as an indirect referer (eg. base class loaders)
var ignoreReferers = []; //eg. [heap.findObject("ignId1")];
//set array with all elements that refer to each target object
var targetObjectsReferers = [];
for (var tarObjIndex in targetObjects) {
var targetObjRefElements = [];
//get the live path of this target object
var livePaths = heap.livepaths(targetObjects[tarObjIndex]);
//cleanup every live path
for (var livePathsIndex in livePaths) {
var curLivePath = livePaths[livePathsIndex];
if ((curLivePath == null) || (curLivePath == "undefined")) continue;
//remove last element from live path as it is the actual object
curLivePath.pop();
//remove elements that equal an ignore referer object
for (var pathElementIndex in curLivePath) {
if ((curLivePath[pathElementIndex] == null) || (curLivePath[pathElementIndex] == "undefined")) continue;
for (var ignoreIndex in ignoreReferers) {
if (identical(curLivePath[pathElementIndex], ignoreReferers[ignoreIndex])) curLivePath.splice(pathElementIndex, 1); //FIXME: this might fail if index is not updated
}
}
}
//merge remaining life paths elements into targetObjRefElements
for (var livePathsIndex in livePaths) {
var curLivePath = livePaths[livePathsIndex];
for (var curLivePathIndex in curLivePath) {
targetObjRefElements.push(curLivePath[curLivePathIndex]);
}
}
//remove duplicate referers
targetObjRefElements = unique(targetObjRefElements, 'objectid(it)');
//add to target objects referers
targetObjectsReferers.push(targetObjRefElements);
}
//filter and return
filter(targetObjectsReferers[0], function(it1) {
var rslt = contains(targetObjectsReferers[1], function(it2) { //FIXME: this limits it to 2 objects!
return identical(it1, it2);
});
return rslt;
});
一段时间后,这会返回一个弹出未定义错误,我正在尝试解决该错误。如果我设法解决这个问题,我可以看看它是否提供了预期的结果。
最佳答案
听起来您正在尝试让所有引用链保持对象的存活状态。您可以使用heap.livepaths(object)函数来获取它们。您可以从以下代码中获取一些提示
var paths1 = heap.livepaths(heap.findObject("1684177040")) // use the objectid of the first instance
var paths2 = heap.livepaths(heap.findObject("1684177160")) // use the objectid of the second instance
var pathArr1 = unique(rcs2array(paths1), 'objectid(it)') // flatten all the livepaths to a single array of instances
var pathArr2 = unique(rcs2array(paths2), 'objectid(it)') // the same for the second instance
// calculate the arrays' intersection - the result is the set of object keeping both of your instances alive
filter(pathArr1, function(it1) {
var rslt = contains(pathArr2, function(it2) {
return (objectid(it1) == objectid(it2))
})
return rslt
})
// helper function to convert an array of reference chains to a flat array of objects
function rcs2array(rcs) {
var arr = new Array()
for(var i=0;i<rcs.length;i++) {
var rc = rcs[i];
for(var j=0;j<rc.length;j++) {
arr.push(rc[j])
}
}
return arr
}
请记住,这仅适用于 VisualVM 和 jhat
关于java - VisualVM OQL : find object that has (indirect) reachables/references to two object IDs?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5034668/
我在 visualvm v1.3.8 中找到所需的对象: filter(heap.objects("java.lang.String"), "/hibernate\\.ejb\\.naming/(it
OQL 中是否可以检索属于一个包的所有对象?或者我可以用 wildcards 查询吗? 正如@haridsv 建议的那样,我试过了: SELECT * from "com.example.*" 和 S
有谁知道仅在堆输出中查找新对象的 OQL 语法吗?我找不到关于 OQL 选项的好的文档,sun 甚至有一个 example仅新输出,没有生成它的查询的示例语法。我所做的是 使用 jhat 创建了一组堆
我正在尝试使用 visualvm 识别内存泄漏。我通过 comapring 快照找到了一些候选对象,但由于这些候选对象太多,我想通过定位堆上最旧的实例来缩小搜索范围。有没有办法使用 OQL 来搜索这样
我正在使用 VisualVM 来分析核心转储。我怀疑某些 XML 对象导致了泄漏,但 String 对象太多,无法一一检查。 我可以使用 OQL 搜索以“GH”开头的字符串吗? 感谢您的帮助。 最佳答
如何在 jhat OQL where 子句中执行连词 [AND]? 我想这样做: select s from sun.security.x509.X500Name s where s.canonic
最近,由于内存不足,我们的生产发生了崩溃。我们获得了堆转储,这为我的团队提供了问题的答案,但我们仍然经历了 OQL 查询执行中的一些不确定行为。 在带有 OQL 的 VisualVM 中,我尝试获取具
我已经尝试过: select sort(obj.displayName, 'lhs < rhs') from my.org.BusinessClass obj 和 select sort(obj.di
如何使用 OQL 语法对 Eclipse MAT 中的对象进行计数?这不起作用: SELECT count(a) FROM org.hibernate.engine.EntityEntry a WHE
请帮帮我。我在 VisualVM 中分析我的堆转储。 如何获取所有值为 == "0"的字符串的数量?我有以下查询: select count(s) from java.lang.String s wh
我有一个堆转储,我正在使用 Eclipse MAT,但我想这应该可以通过 visualvm 或任何 OQL 客户端工作。 我们可以通过做类似的事情来选择一个类的所有实例的字段 select s.fie
我的查询结果有数百万行。我已经修改了visualvm.conf -J-DOQLController.limitResults=1000000 目前,作为一种解决方法,我运行查询,然后将结果复制并粘贴到
我的查询结果有数百万行。我已经修改了visualvm.conf -J-DOQLController.limitResults=1000000 目前,作为一种解决方法,我运行查询,然后将结果复制并粘贴到
我正在运行 java cocoon 2 和castor oql。我试图按今天的日期过滤我的 oql 查询,但我似乎无法弄清楚(或在谷歌中找到)日期的语法。数据库是 mySql,但 oql 由 java
我有一个内存转储文件,其中包含近 5000 个特定对象的实例。这些对象将被写入数据库,而我这样做的方式是在 jvisualvm 中编写一个 OQL 查询以生成一个字符串,该字符串将用作 SQL 插入,
我正在尝试使用 jhat/OQL 来跟踪 Tomcat 容器中的内存泄漏。我想问的问题是: “显示可从 javax.servlet.http.HttpSession 访问的 foo.bar.Cache
当我在 Eclipse Memory Analyzer 中执行以下 OQL 时 SELECT key FROM com.google.common.cache.LocalCache$StrongAcc
我正在尝试编写这样的查询: select {r: referrers(f), count:count(referrers(f))} from com.a.b.myClass f 但是,输出不显示实际对
已在 VisualVm 中打开 Java 堆转储,并且我正在尝试制定 OQL 查询以返回按对象参数之一排序的特定类 (se.greger.sven.olof.node.Task) 的所有对象 (重新灌
我正在使用 VisualVm 来分析在 Tomcat 中运行的 Web 应用程序。 Tomcat 不断因内存不足错误而崩溃,因此我试图找出应用程序中导致该错误的原因。当我从 VisualVm 运行内存
我是一名优秀的程序员,十分优秀!