问题标签 [visualvm]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - Java 内存使用/线程池性能问题
这些事情显然需要仔细检查和代码可用性来彻底分析并给出好的建议。然而,这并不总是可行的,我希望可以根据我在下面提供的信息为我提供好的提示。
我有一个使用侦听器线程来侦听传入数据的服务器应用程序。传入的数据被解释为特定于应用程序的消息,然后这些消息会引发事件。
到目前为止,我对事情的完成方式并没有任何控制权。
因为这是一个遗留应用程序,所以这些事件以前由同一个侦听器线程(主要是单线程应用程序)处理。这些事件被发送到一个黑盒,并产生一个应该写入磁盘的结果。
为了提高吞吐量,我想使用一个线程池来处理这些事件。这个想法是侦听器线程可以在每次创建事件时生成新任务,并且线程将负责黑盒调用。最后,我有一个后台线程执行写入磁盘。
仅使用以前的设置和后台编写器,一切正常,吞吐量是以前的约 1.6 倍。
当我添加线程池时,性能会下降。一开始,一切似乎都运行顺利,但过了一会儿,一切都变得非常缓慢,最后我得到了 OutOfMemoryExceptions。奇怪的是,当我每次将任务添加到池中时打印活动线程的数量(以及有关排队的任务数量等信息)时,看起来线程池跟上没有问题生产者(监听线程)。
使用 top -H 检查 CPU 使用情况,一开始它分布得很均匀,但最后工作线程几乎没有活动,只有侦听器线程处于活动状态。然而它似乎并没有提交更多的任务......
任何人都可以假设这些症状的原因吗?您是否认为遗留代码中的某些内容(我无法控制)更有可能在添加多个线程时变坏?内存不足的问题应该是因为某处的某些队列变得太大,但是由于线程池几乎从不包含排队的任务,所以不可能是这样。
欢迎任何想法。特别是关于如何更有效地诊断这种情况的想法。我怎样才能更好地了解我的线程正在做什么等。
谢谢。
java - JFreeChart 堆空间
我只是想知道是否有一种方法可以阻止 JFreeChart 破坏堆,或者有一种方法可以做到这一点。SpreadsheetDate
,Millisecond
并且Day
占用了大约 70 MB 的堆空间,但垃圾收集器也可能会受到影响。他们是我的应用程序中堆空间的最大用户。还有使用 12 MB 的 TimeSeriesDataItem。对于所有图表,每 200 毫秒左右记录一次。
我还更新/存储了一些不会立即使用的数据集,只有当用户单击 UI 中的项目以显示它们时。
此外,是否有可能在 Visual VM 中显示大量垃圾收集抖动是由于内存采样器表中的特定类名造成的?
干杯,
克里斯
java - 如何使用 jvisualvm 监控 Tomcat,显示 visualgc?
我已经仔细检查了以下内容:
- 我在运行 Tomcat 的同一个盒子上运行 jvisualvm。
- 这是 Java 6u19。
- 我的 Tomcat 服务以我登录的同一用户身份运行。
- 我的 Tomcat 服务使用与我使用 jvisualvm 完全相同的 JVM 目录。
- Tomcat 在特定端口上启用了 JMX,但我认为这对我没有帮助。
有了这一切,我确实在 jvisualvm 的“本地”列表中看到了我的 Tomcat 进程。它显示为“<Unknown Application> (pid 5644)”。如果我双击它,那么每个选项卡都会显示“此 JVM 不支持”。但是,VisualVM 显示在“本地”中,并且所有选项卡都适用于它,显然使用相同的 JVM 实例。没有明显的方法可以将 JMX 连接添加到“<Unknown Application>”实例。
我确实在“本地”中看到 Tomcat 的 JMX 实例为“localhost:(我的端口号)”,这是可行的,但是 Visual GC 选项卡显示“不支持此 JVM”,我认为这意味着 Visual GC 不通过 JMX 工作。
我究竟做错了什么?我试过启动 jstatd。它没有任何区别。当我启动 jstatd 时,visualvm 会看到一个“本地”“jstatd”,但是当我双击它时,它似乎只是监视该 jstatd 进程而不是任何其他 Java 进程。
注意:我决定尝试不将 Tomcat 作为服务运行,而是直接在 CMD 窗口中运行,中提琴,现在 visualvm 可以完美运行。当我运行“jps”并收到投诉“处理信息不可用”时,我想我会尝试这个,然后用谷歌搜索,发现有人说他们在运行任何 Java 应用程序作为服务时得到了这个。这有助于测试平台,但无助于弄清楚如何监控生产系统。
这是在 Windows Server 2003 上的 Tanuki 包装器下作为 Windows 服务运行的 Tomcat。
java - VisualVM - 不是有效的核心转储
我有从 JVM OutOfMemory(JDK 1.5 版本)生成的 .hprof 堆转储。
当我尝试在 VisualVM 中添加此文件时,它告诉我文件不是有效的核心转储。
但是,我可以毫无问题地为此转储文件运行 jhat。
任何想法为什么?
java - 在 VisualVM 中分析整个 Java 程序的执行
在 Java 分析中,现在似乎所有(免费)道路都通向 JDK6 中包含的 VisualVM 分析器。它看起来像一个很好的程序,每个人都吹捧如何将“附加到正在运行的进程”作为主要功能。问题是,这似乎是在本地进程上使用它的唯一方法。我希望能够在分析器中启动我的程序,并跟踪它的整个执行过程。
我已经尝试使用如何使用 visualvm 分析应用程序启动中-Xrunjdwp
描述的选项,但是在两种传输方法(共享内存和服务器)之间,对我来说都没有用。VisualVM 似乎与前者没有任何集成,VisualVM 拒绝连接or ,所以后者也不好。我还尝试在我的程序中插入一个简单的读取以插入执行暂停,但在这种情况下,VisualVM 会阻塞直到读取完成,并且在执行完成之前不允许您开始分析。 我也尝试过查看Eclipse 插件,但该网站充满了死链接,当我尝试使用它时,启动器只是崩溃了localhost
127.0.0.1
System.in
(这可能不再准确)。NullPointerException
来自 C,这对我来说似乎不是一个特别困难的任务。我只是错过了什么还是这真的是一个不可能的要求?我对任何类型的建议持开放态度,包括使用不同的(也是免费的)分析器,我不反对命令行。
performance - 为什么 TeraSort 映射阶段在 CRC32.update() 函数中花费大量时间?
我正在尝试分析哪些函数在 TeraSort Hadoop 作业中消耗的时间最多。对于我的测试系统,我使用的是基本的 1 节点伪分布式设置。这意味着 NameNode、DataNode、Tasktracker 和 Jobtracker JVM 都在同一台机器上运行。
我首先使用 TeraGen 生成约 9GB 的数据,然后在其上运行 TeraSort。在 JVM 执行时,我使用 VisualVM 对其执行进行采样。我知道这不是最准确的分析器,但它是免费且易于使用的!我使用最新版本的 Apache hadoop 发行版,我的实验在基于 Intel Atom 的系统上运行。
当我查看 VisualVM 中 Hot Spots-Methods 的 Self time (CPU) 时,我发现 java.util.zip.CRC32.update() 函数占用了将近 40% 的总时间。当我在调用树中查看这个函数时,它是由映射器的 main() 函数调用的,特别是当 IdentityMapper.map() 从 HDFS 读取输入文件时。实际调用 CRC32.update() 函数的函数是 org.apache.hadoop.fs.FSInputChecker.readChecksumChunk()
我对此有三个问题:
为什么要为从 HDFS 读取的块更新 CRC32 校验和?如果我理解正确,一旦读取一个块,从磁盘读取的数据与块的 CRC 的简单比较应该是唯一的操作,而不是生成和更新块的 CRC 值。
我查找了更新函数的源代码,它是由 java.util.zip.CRC32.java 文件实现的。调用的特定函数是具有三个参数的重载 update() 方法。既然这个功能是用Java实现的,有没有可能多层抽象(Hadoop、JVM、CPU指令)降低了CRC计算的原生效率?
最后,我的 VisualVM 检测方法或对采样结果的解释是否存在严重问题?
谢谢,
java - 如何使用 VisualVM 发现瓶颈/问题
正如我在运行 Web 应用程序 5 天后性能下降中发布的那样,如何发现瓶颈?,我有一个应用程序在运行一段时间后变慢的问题。
我让 VisualVM 运行并在不同时间之间制作了快照。现在应用程序真的很慢,但我不知道如何发现瓶颈。它们彼此之间没有太多区别,唯一增长一点的是堆,它在一段时间后成功地被垃圾收集。
谁能给我一些指示?
以下是快照(应用程序):
[1] http://www.2shared.com/file/W4XJ6HtE/application-1314108550032.html
[2] http://www.2shared.com/fadmin/22521338/f512f97e/application-1314097232727.apps.html
谢谢!
编辑:仔细观察,我注意到 CPU 甚至没有被使用太多......而且系统真的很慢!
java - 用于 cpu 分析的过滤类在 Java VisualVM 中是否有效?
我想过滤在 Java VisualVm(版本 1.7.0 b110325)中哪些类被 cpu-profiled。为此,我尝试在 Profiler -> Settings -> CPU-Settings 下为我的测试包设置“ Profile only classes ”,但没有效果。然后我尝试通过将所有 java.* 和 sun.* 类设置在“不要配置类”中来摆脱它们,这也没有效果。
这只是一个错误吗?还是我错过了什么?有解决方法吗?我的意思是:
- 为更好的分析器付费
- 手动采样(请参阅可以使用分析器,但为什么不直接停止程序?)
- 切换到调用树视图,这并不好,因为只有 Profiler 视图给了我每个方法消耗的 CPU 百分比。
我想这样做主要是为了获得每个方法消耗的 CPU 的一半正确百分比。为此,我需要摆脱烦人的测量,例如sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run()
(大约 70%)。许多用户似乎有这个问题,见例如
java - 使用 VisualVM 检查以 -javaagent 启动的 java 应用程序
我正在尝试使用 VisualVM 检查 Java 应用程序。通常没有问题,但我正在尝试设置 Eclipselink 编织,所以我使用 -javaagent 标志启动程序;
当我使用 Viusal VM 查看程序时,在 Monitor 页面上什么也看不到。
不幸的是,VisualVM 文档站点(位于 visualvm.java.net )似乎已关闭。
感谢任何可以帮助我理解我做错了什么的人。
jvm - hprof 中“无引用”的对象
我正在调查hprof
VisualVM 中的一个文件
服务器正在运行 JDK 1.4.2_30,并且有 1 GB 堆,NewSize 为 200 Mb。
hprof 显示 71% 的堆被 56000 个实例占用,int[]
并且在 VisualVM 中查看时,这些 56K 数组都没有引用
按照我们的说法,如果“没有引用”,这应该被垃圾收集。所以问题是:
a) 有没有办法找出这些参考资料?
b) 这是一个不正确的快照 - 即进行堆转储的操作是否进行了某种 GC?
c) 我们是否应该查看 VisualVM 中的“保留大小”对象?
作为更新- 我们仍然不知道这些int[]
是什么,但下一个最大的对象是 Pool 中的 Weblogic 内部 EJB 引用,我们发现其中一个不正确的设置已将内存利用率从早期频繁的 Full GC 降低到 30%