网上很多visual vm的指南手册之类,visual vm最新的下载好后,直接运行即可。
如果无法运行,在右键选择要执行的类,选择Run As-->Open Run Dialog,在新窗口中选择Arguments标签。
vm参数上增加:-XX:+PerfBypassFileSystemCheck
【代码背景介绍——4个线程】
客户端向我的Server中发送消息,我的代码中有一个正常消息List infoList,一个异常的消息List errList。对于这两个List,都各自有一个监听线程,监听到了List中有数据,则发送出去,无数据则休眠。
同时为了防止数据丢失,每个数据在进入这两个List前都要写入文件系统。当数据发送成功后,则将正常发送数据写入待删除的infoDelList,异常重发的数据写入errDelList。因此又增加了infoDelList和errDelList监听,当这两个List有数据,则遍历这并删除文件系统的数据。
因此我有4个线程监听这4个List。
【开始测试】
第一次测试。
先启动服务器,1分钟内无客户端发送的数据,那么此时4个监听线程都在休眠。
1分钟后,客户端开始每一秒钟并发20个,总共5000个数据。
这次我让所有的客户端数据全部可以发送成功。那么通过visual vm可以看到2个监听应该一直在休眠的。如图:
解释:
【0:00-1:00】:可以看到有4个线程在有并发数据前都在紫色的休眠状态。
【1:00-2:00】:当并发开始后,Thread-0和Thread-2一直在Sleeping上的紫色状态有些开始有绿色的Running的时间片了。在1分18秒时刻,Thread-2线程正在执行,Thread-0线程在该时刻是红色的监视状态。表示Thread-2想执行synchronized中的代码,但是没有锁,进入堵塞等待了,可以看到在1分35秒左右Thread-2获得时间片执行了。
说了半天的Thread-1,Thread-2,怎么知道他们对应的代码是哪个呢?visual vm中显示的名字其实就是线程的名字。可以通过打印日志,查看代码中个线程和visual vm的线程名字对应。如下在run方法中,进入循环之前打印前获取线程名字:Thread.currentThread().getName(),下面这个线程打印出来是Thread-0 。
import java.io.File; import java.util.List; import org.apache.log4j.Logger; /** * 消息中心磁盘文件删除监听 * @author zhuoyueping * */ public class DiskDeleteListener extends Thread{ public static List pathList = null; private static final Logger log = Logger.getLogger(DiskDeleteListener.class); private static DiskDeleteListener instance = new DiskDeleteListener(); private DiskDeleteListener(){ super(); } public static DiskDeleteListener getInstance(){ return instance; } public void run() { log.info("Thread Name="+Thread.currentThread().getName()); while(true){{ try { if(DiskDeleteListener.pathList!=null&&DiskDeleteListener.pathList.size()>0){ for(int i = 0;i<DiskDeleteListener.pathList.size();){ String path = (String) DiskDeleteListener.pathList.get(i); if(path!=null){ File file = new File(path); if(file.exists()){ //删除文件 file.delete(); DiskDeleteListener.pathList.remove(i); }else{ DiskDeleteListener.pathList.remove(i); log.error("第"+i+"个,"+"文件不存在,清理内存数据完成"+path); } }else{ DiskDeleteListener.pathList.remove(i); } } } Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); log.error(e); } } } } }
如果覆盖start方法,在start方法中去取Thread.currentThread().getName(),将得到main,即启动该线程的线程名。因此Thread.currentThread()一定是在run中的线程,一个线程的start被执行时候,Thread.currentThread()获得的是它的父线程。
Thread-0,用于删除已经发送成功的消息的磁盘文件;而跟它竞争的Thread-2则是监听待发送的infoList。
多次在同一个时刻,thread-0是红色的堵塞,threa-2在执行,看起来像是他们在竞争同一资源。查代码可以看到,这两个线程都会对DiskDeleteListener.pathList进行读写操作,thread-0监听到list不为空则删除磁盘文件,threa-2发送一个消息成功,则将消息的磁盘地址加入到list中。而这个pathList是一个线程安全的List,通过下面的方法构造出来的:
DiskDeleteListener.pathList = Collections.synchronizedList(new ArrayList());
最后异常消息发送和异常磁盘监听的两个线程一直处于休眠状态。
相关推荐
3. **线程分析**:Visual VM提供线程的详细视图,显示线程状态、阻塞原因以及死锁检测,帮助调试多线程问题。 4. **方法和类的性能分析**:可以追踪方法调用和类加载,了解哪些代码段执行时间较长,优化性能关键...
Visual VM是一款强大的Java性能分析工具,它为开发者提供了一种可视化的方式来监控和分析JVM(Java虚拟机)上的应用程序。1.3.6是Visual VM的一个版本,它包含了许多改进和增强,使得开发者能够更有效地理解和优化...
Visual VM 提供了查看和分析线程状态的能力,包括线程的挂起、等待、阻塞等状态,这对于调试多线程问题非常有帮助。 3. **CPU性能分析**:通过CPU视图,开发者可以查看哪些方法消耗了最多的CPU时间,从而找出性能...
Visual VM是一款强大的Java性能分析工具,它集成了多种功能,如内存分析、线程分析、CPU剖析以及JVM垃圾收集(GC)监视。其中,GC插件是Visual VM的一个重要组成部分,用于深入理解Java应用程序的内存管理和垃圾收集...
Visual VM是一款强大的Java性能分析工具,它包含了丰富的功能,如CPU和内存监控、线程分析、JMX连接等。在Java开发和运维过程中,我们常常使用Visual VM来诊断和优化应用性能。而JConsole则是另一个Java性能监视工具...
- **线程CPU使用**:分析各个线程的CPU占用情况,帮助识别CPU密集型任务。 - **热点代码分析**:通过热点图展示哪些代码段消耗了最多的CPU资源。 通过上述内容的学习,我们可以看出VisualVM是一款非常实用且功能...
- **多线程的使用**:在处理较大图片或者视频时,可能会遇到程序死掉或者无响应的问题。这通常和程序单线程运行的性能瓶颈有关。采用C#的多线程技术可以提高性能和响应速度,但具体实现需要根据程序逻辑和需求详细...
远程线程注入是通过在目标进程中创建一个新的线程,并在该线程上下文中执行指定的代码。这允许一个进程(注入者)在另一个进程(被注入者)中运行其代码,而无需修改被注入进程的可执行文件。这一过程通常涉及以下...
它与JVisualVM(Java Visual VM)紧密集成,提供了图形化的界面,帮助用户直观地理解Java虚拟机(JVM)的内存管理和垃圾回收过程。在本文中,我们将深入探讨Visual GC插件在JDK 1.6.0_45版本中的实际应用和其核心...
JVisualVM是一款集成化工具,它包含了多种Java应用性能分析功能,如监视CPU使用率、内存状况、线程状态、类加载、垃圾收集等。JVisualVM不仅能够本地运行,还可以远程连接到其他正在运行的Java进程,为开发者提供了...
在本场景中,我们讨论的是在虚拟机环境中运行的VM版Windows CE 6.0,它是在VMware Workstation上进行测试和使用的。 首先,让我们深入了解一下Windows CE 6.0的主要特点: 1. **模块化设计**:Windows CE 6.0采用...
它允许开发者深入了解JVM(Java虚拟机)的内部工作,包括内存使用、CPU消耗、线程状态以及方法调用等信息。VisualVM提供了丰富的可视化界面,使得开发者能够方便地监控和诊断Java应用程序的性能问题。 标题中的...
在IT领域,尤其是在系统编程和调试中,获取指定进程的线程信息是一项基本且重要的任务。...通过学习和理解这段代码,你将能够编写出自己的进程线程信息获取工具,为系统监控和性能分析提供有力支持。
VisualVM 是一个功能强大且免费的 Java 应用程序监控和分析工具,旨在提供 Java 虚拟机 (Java Virtual Machine, JVM) 上运行的 Java 应用程序的详细信息。 VisualVM 能够提供强大的分析能力,囊括多个 JDK 命令行...
`OpenProcess`函数用于获取对目标进程的访问权限,参数如`PROCESS_CREATE_THREAD`, `PROCESS_VM_OPERATION`, 和 `PROCESS_VM_WRITE`分别允许创建线程、执行虚拟内存操作和写入虚拟内存。如果没有足够的权限,就需要...
它集成了多种功能,包括内存分析、线程检查、CPU使用率监控、类加载和垃圾回收查看等,能够帮助开发者深入理解Java应用程序的运行状态。 标题中的"visualvm中文版"指的是该工具提供了中文界面,使得中国用户在使用...
2. 在"配置属性"中,选择"多线程DLL",并确保使用与Java相同的编译器版本,这里是VC9.0。 3. 编写JNI函数,遵循JNI头文件(如`jni.h`)定义的规范。这些函数需要与Java中的方法签名匹配。 在Netbeans中配置JNI项目...