我正在尝试打开本地 java 应用程序以使用 VisualVM 进行分析,但自从我一周前上次使用它以来,它突然停止工作,我可以在应用程序框中看到程序,但如果我尝试打开从 cmd 行启动的程序或任何其他 java 程序(如 eclipse),它只会挂起,状态栏显示正在打开。如果它在尝试打开我自己的应用程序时尝试选择另一个虚拟机来打开,则 VisualVM 将锁定。
请注意,我可以打开并分析 VisualVM JVM,但不能打开和分析任何其他 JVM,
除了执行常规操作系统更新(包括内核)之外,我没有更改任何设置。我已确保我的 /tmp/hsperfdata_myusername 是可访问的,并且当我从命令行启动可视化 VM、Eclipse 或我自己的 java 程序时,我可以看到与文件夹中创建的进程 pid 相匹配的文件号。我尝试以 root 身份启动我自己的程序和 VisualVM 并尝试它,但没有什么区别。我已删除 .visualvm 文件夹以清除任何问题,但它不起作用,并且 Visualvm 的日志文件未提及任何错误。
我正在使用 java 7_u45-b18 运行 fedora 19。
当我启动 Visual vm 时,会打开一个端口 TCP localhost6.localdomain6:35138 (LISTEN)
如果我打开我自己的应用程序或 eclipse 并将其放置 10 分钟,它最终会连接(过去是立即连接),但是 CPU 分析和 GC 命令被禁用,这正是我想要的。
我知道您需要为远程连接指定 JMX 端口,但这都是本地的,所以我不明白为什么它突然变得很糟糕!
任何帮助将非常受欢迎。
我对POJO的内存使用情况和实例数进行采样.如果我在视觉vm中按"垃圾收集"并且我可以看到实例,这是否意味着它的内存泄漏?
如何强制jvm每天在中午做垃圾收集?(就像在visualvm上自动按垃圾收集一样)?我看到visualvm的cpu用法,gc总是0%.我设置-xmx -xms 1024m,但通常内存使用量约为200mb.这是因为GC只在必要时才完成?这就是gc cpu时间总是0%的原因
如何检查上次进行'完整GC'的时间?
我有兴趣知道为什么visualvm OQL在以下语句中有问题:
select filter(heap.objects("java.util.HashMap"), isTrue(it));
function isTrue(object) {
return true;
}
Run Code Online (Sandbox Code Playgroud)
例外情况是:
javax.script.ScriptException: sun.org.mozilla.javascript.internal.EcmaError: ReferenceError: "it" is not defined. (#1)
Run Code Online (Sandbox Code Playgroud)
相比之下,visualvm OQL在以下任何示例中都没有问题:
示例1(注意"它"未引用):
select filter(heap.objects("java.util.HashMap"),
function(it) {
return true;
});
Run Code Online (Sandbox Code Playgroud)
示例2(注意"它"被引用):
select filter(heap.objects("java.util.HashMap"), isTrue("it"));
function isTrue(object) {
if (object instanceof String) {
throw "String passed!";
}
return true;
}
Run Code Online (Sandbox Code Playgroud)
示例3("函数(it)"由于某种原因在OQL中专门处理?):
select filter(heap.objects("java.util.HashMap"), function(it) { return isTrue(it); });
function isTrue(object) {
return true;
}
Run Code Online (Sandbox Code Playgroud)
我问这个是因为它看起来不直观,非直观行为的变化出乎意料地出现,当我试图创造可用的东西时,我放慢了速度.
我的查询结果有数百万行。我已经修改了visualvm.conf
-J-DOQLController.limitResults=1000000
Run Code Online (Sandbox Code Playgroud)
目前,作为解决方法,我运行查询,并将结果复制并粘贴到文件中。然而,结果给我的记忆带来了很大的压力。是否有办法跳过将结果显示到 UI,而直接将结果流式传输到文件?
我的查询如下所示:
select { obj1: busObj.obj1, ... , objN: busObj.objN }
from com.my.BusinessObject busObj
Run Code Online (Sandbox Code Playgroud) 我有一个Web应用程序部署到本地Glassfish服务器,我想分析,以便查看我的代码的哪些部分最常访问.该代码由JSF bean和远程EJB组成,两者都部署在单个EAR中.我尝试使用VisualVM来分析我的应用程序,但是,尽管我可以成功连接到Glassfish服务器以及我的上下文根,但VisualVM似乎并不会分析我自己的类(在com.test.*命名空间中).我看到很多Sun类和其他依赖项如Lucene被访问,但不是我自己的类的单个实例.
我的问题是:我做错了什么,或者这是VisualVM的一个缺点,我应该尝试使用不同的分析工具吗?
我试图使用我的java应用程序检测内存泄漏VisualVM.我正在使用VisualVM 1.3.5.
我按照本教程中应该说的步骤http://rejeev.blogspot.in/2009/04/analyzing-memory-leak-in-java.html
按照这些步骤后,我不知道在哪里开始编辑我的代码.有没有办法找到内存泄漏的java类和行号来纠正代码.
或者任何一个人建议我使用它找到内存泄漏的好方法VisualVM.
肯定赞赏好的答案.
今天,我对得到的 Visual VM 分析结果感到困惑。
我有以下简单的Java方法:
public class Encoder {
...
private BitString encode(InputStream in, Map<Character, BitString> table)
throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
BitString result = new BitString();
int i;
while ((i = reader.read()) != -1) {
char ch = (char) i;
BitString string = table.get(ch);
result = result.append(string);
}
return result;
}
}
Run Code Online (Sandbox Code Playgroud)
此方法从流中一次读取一个字符。对于每个字符,它查找它的位串表示形式,并将这些位串连接起来以表示整个流。
BitString 是一种自定义数据结构,它使用底层字节数组表示位序列。
该方法的性能非常差。问题在于BitString#append- 该方法创建一个新的字节数组,从两个输入 BitString 复制位并将其作为新的 BitString 实例返回。
public BitString append(BitString other) {
BitString result = new BitString(size + other.size); …Run Code Online (Sandbox Code Playgroud) 我在Java中运行以下程序(通过Eclipse IDE):
package threaddemo;
class Runner extends Thread{
@Override
public void run() {
while(true)
System.out.println("Running in a thread ....");
}
}
public class ThreadClass {
public static void main(String[] args) {
Runner thread1 = new Runner();
thread1.start();
Runner thread2 = new Runner();
thread2.start();
}
}
Run Code Online (Sandbox Code Playgroud)
程序运行时,我试图在JVisualVM中看到线程活动.我希望同时看到两个线程都是绿色的(即并发运行),但是我看到在执行期间的任何时间点,一段时间内任何一个线程处于Monitor状态,而另一个线程正在执行.片刻之后,它们会切换(前者正在执行,而后者处于监控状态).怎么会这样?
我正在使用VisualVM来分析一个javafx 8应用程序,该应用程序执行一些绘图并使用比我想要的更多的内存.它似乎没有泄漏,但由于某种原因,我的总堆永远不会减少,即使我使用的堆上升和下降,因为我选择不同的文件来图形.所有的峰值都是当我绘制一个新文件然后在我退出该屏幕时退回时,但总堆刚刚开始并保持不变.这是正常的吗?

这是一个非常基本的问题.但我没有通过互联网得到任何明确的答案.我有以下代码
public static void main(String[] args) throws InterruptedException {
Thread.sleep(1000000);
}
Run Code Online (Sandbox Code Playgroud)
我连接了JVisualVM并开始监视堆使用情况.我可以看到堆使用量随着时间的推移逐渐增加.但是,这里我没有创建任何新对象.这背后的原因是什么?为什么在没有创建任何新对象的情况下堆利用率会增加?
提前致谢.
我目前正在尝试在 java web/soap 应用程序中寻找/一些内存泄漏,因此我想在 IntelliJ 中使用带有插件的 VisualVM。
我使用的环境:Windows 10 1607 14393.2248 Java 1.8.0_121 VisualVM 1.4.1
起初安装后它曾经工作过。
但现在它停止工作 - 弹出错误消息:
Error: Local Java Applications Cannot Be Monitored
Please see the VisualVM Troubleshooting Guide for more information and steps to fix the problem.
https://visualvm.github.io/troubleshooting.html#jpswin2
Run Code Online (Sandbox Code Playgroud)
那里说:
Description: An error dialog saying that local applications cannot be monitored is shown immediately after VisualVM startup. Locally running Java applications are displayed as <Unknown Application> (pid ###).
Resolution: This can happen on Windows systems if the …Run Code Online (Sandbox Code Playgroud) visualvm ×13
java ×10
jvisualvm ×3
performance ×3
memory-leaks ×2
oql ×2
profiling ×2
ejb ×1
javafx-8 ×1
javascript ×1
jhat ×1
profile ×1
thread-dump ×1
wildfly ×1
wildfly-16 ×1