1。启动
在命令行输入jvisualvm。如果jdk安装正确的话(6.x以上版本),就会看到如下的一个窗口:
看起来相当简洁,不像是很强大的样子。
2。运行一个Java程序IncTestN,jvisualvm会自动找到它
3.右键点击它,”打开”
可以看到它有很多标签页,可以让我们监测程序的各种数据。默认没有这么多,我其实安装了一些jvisualvm的插件。
4。查看jvm参数及系统属性
5。查看cpu、内存、类、线程的统计数据
注意,右边第一个还可以查看PermGen。对于scala程序,因为它产生了大量的类定义,所以PermGen有可能会不足,可通过该选项查看PermGen,适当调整:
可以看到,对于本程序来说,PermGen还是比较充分的,无须调整。
6。查看各线程运行情况
这个是重点,我们需要知道各线程的运行情况,特别是否被synchronized阻塞了。
注意右下角,有四个状态说明,分别是:
- 运行(Running):我们最喜欢的状态。说明该线程正在执行代码,没有问题。
- 休眠(Sleeping):调用了Thread.sleep后的状态,说明线程正停在某个Thread.sleep处
- 等待(Wait):手动调用了wait方法,或者某些IO操作,在阻塞中等待数据。
- 监视(Monitor):这里就是我想找的问题了。它表示线程想执行一段synchronized中的代码,但是发现已经有其它线程正在执行,自己被block了,只能无奈地等待。如果这种状态多,说明程序需要好好优化。
从上面的这个图可以看到,下面多个线程都处于”监视”状态。多个线程都卡在了独木桥的一头过不去,干不了活干着急呢。
当然这个程序是我专门设计成这样的,存在着严重的性能问题,需要好好优化。
7。查看各线程的统计数据
如果我们需要一些统计数据,比如某个线程总共运行了多少时间,”运行”状态有多久(或百分比),休眠、等待、监视有多久,则需要用到”表”这一页。
从中可以看到这个悲催的程序,几分所有的时间都用在了synchronized的阻塞上了。只有百分之零点几的时间在运行中,效率可真低啊。
还可以使用图表方式来看这些数据,得到更直观的体验:
8。查看各方法的运行时间
想不想程序中到底是哪些方法一直在运行?可使用”抽样器”功能:
我们需要先点击上面的”CPU”按钮,它才会开始统计,下面的数据会慢慢多起来。从上图可以看出,程序一直在运行SynIncer.inc()方法,它占用了所有方法执行总时间的99.8%。如果我们想提高程序性能,则需要重点优化它,让它运行得更快。
还想知道方法被调用的次数?使用”Profiler”页中的功能:
它与抽样器很像,但是最后多了一个”调用次数”。
9。查看哪些对象占用了最多的内存
当出现了内存不足的错误时,想不想知道到底是哪些对象把内存都占用了?这时需要使用”抽样器”的”内存”检测功能:
从表中可以看出当前最多的是哪些对象,它们有多少个,用了多少个字节。
10。安装更多插件
jvisualvm还在线提供了很多插件,提供了更多的功能。我们可以通过”工具”->”插件”,找到并安装它们。推荐全装,比如我就安装了全部(当前有16个):
安装重启后,再找到某个程序节点,就会发现有更多的标签页可用。
11。查看MBeans
MBeans可以将程序中的某些信息暴露给外部。有一些库在设计时,就考虑到了这一点。如果我们不满足于前面那些基础信息,可以在这里看看。
由于当前程序没有使用到提供MBeans信息的库,所以看不到什么多少有用的信息。如果你使用了某些数据库连接池(提供了MBeans功能的),可以在这里看到池里的一些信息,还可以通过”Operations”标签页,对程序数据进行一些修改。
12。查看gc情况
垃圾回收是我们不能忽略的一个地方。我们可以通过”Visual GC”页,查看到非常详细的垃圾回收情况。
可以说,这个功能提供的信息真是非常地详尽,连两个小Eden的情况也实时地表现出来了。不过要看懂这些数据,还是需要先到网上看看讲解Java垃圾回收的文章,了解其内部原理才行。
13。更多更详细的监测内容
Tracer页提供了更多的监测内容
可以看到程序中遍布探针,让我们实时了解到各处的运行情况。先选中感兴趣的内容,然后点击”Start”按钮即可。
这一块比较专业,普通开发人员可能都不知道这些数据到底有什么用。但专业人士可能会觉得会很需要它们。
JvisualVM的大部分功能都已经演示完了,我想它的功能的确很强大,在我们平时的开发中会非常有用。
相关推荐
至于工具有关,开发者可以利用各种线程分析工具来诊断和优化多线程程序,例如Java的JVisualVM,它可以显示线程状态,帮助找出死锁等问题。此外,内存分析工具,如Valgrind,可以帮助检测因线程不安全导致的内存泄漏...
最后,工具在Java多线程开发中也起着重要作用,例如JVisualVM、JConsole等Java自带的监控工具,可以帮助开发者分析线程状态、检测死锁、查看内存使用情况等,从而更好地理解和优化多线程程序。 总之,Java多线程...
线程监控是软件开发中一个重要的环节,尤其是在多线程编程环境下,理解并管理线程的行为对于优化系统性能、防止死锁和资源竞争至关重要。本文将深入探讨线程监控工具的功能、用途,以及如何利用这些工具查找并解决...
线程同步是多线程编程中必须面对的问题,主要是为了避免数据竞争和保证数据一致性。Java提供了多种同步机制,如synchronized关键字、volatile变量、Lock接口(如ReentrantLock)以及java.util.concurrent包中的高级...
5. **信号量与互斥锁**:在多线程环境中,为了防止数据竞争,通常会使用同步机制如信号量和互斥锁。信号量控制资源的并发访问数量,互斥锁则确保同一时间只有一个线程可以访问共享资源。 6. **源码分析**:标签中...
面试中可能涉及的知识点包括:基础语法、集合框架(List、Set、Map的区别与使用)、异常处理、多线程(同步机制、线程池)、IO流、反射、设计模式等。 2. **Redis**: Redis是一款高性能的键值存储系统,常用于缓存...
在处理反毛刺故障时,确保线程安全至关重要,因为毛刺可能源于多线程环境中的竞争条件或者不正确的同步机制。 1. **锁机制**:Java提供了`synchronized`关键字,可以用于保护临界区,避免多个线程同时访问同一资源...
- 多线程:线程的创建方式、同步机制(synchronized关键字、Lock接口)、并发工具类(如Semaphore、CountDownLatch)。 2. **Java高级特性** - 泛型:理解泛型的使用,类型擦除,通配符等。 - Lambda表达式:...
2. **多线程** - **线程的创建与同步**:线程的实现方式(实现Runnable接口和继承Thread类),线程同步机制(synchronized关键字、wait/notify、Lock接口等)。 - **死锁、活锁与饥饿**:理解这些并发问题的定义、...
4. **多线程** - **线程的创建**:通过Thread类或实现Runnable接口创建线程。 - **同步机制**:熟悉synchronized关键字、Lock接口(如ReentrantLock)及并发工具类(如Semaphore、CyclicBarrier)。 - **死锁**:...
在Java中,可以使用多线程来实现并行性,例如通过`Thread`类、`Runnable`接口或`ExecutorService`框架。 2. **实时编程**:实时编程是指程序必须在预定的时间限制内完成其操作,否则可能导致系统故障。Java提供了...
5. **多线程与并发**: 在Java中,多线程是常见的数据来源之一,性能分析可能包括对线程同步、竞态条件和死锁的检测。 6. **日志和追踪**: 应用程序可以通过日志记录关键操作,而Tracing框架(如Java Flight ...
3. **多线程**: - **线程的创建方式**:通过Thread类和实现Runnable接口两种方式。 - **线程同步**:synchronized关键字,wait()、notify()和notifyAll()方法,以及Lock接口和ReentrantLock类的应用。 - **死锁...
为了让游戏流畅运行,通常会使用多线程来分离图形渲染和游戏逻辑。在J.Heli中,你可能会学到如何使用Thread类或Runnable接口创建和管理线程,以及如何通过synchronized关键字来处理线程同步问题,防止数据竞争。 六...
- Java的`Thread`类和`ExecutorService`接口是进行多线程编程的基础,合理的线程调度和管理可以提高程序运行效率。 - `synchronized`关键字和`Lock`接口用于线程同步,防止数据竞争。 - `Concurrent`包提供了线程...
音乐播放器模块通常包括播放、暂停、快进、倒退、音量控制等功能,这些可以通过Java的多线程和异步处理来实现流畅的用户体验。音乐库管理则涉及到文件I/O操作,Java的File类和流处理API能够方便地读取和存储音乐文件...