`
longzhun
  • 浏览: 371681 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

jvisualvm检测多线程的竞争

 
阅读更多

1。启动

在命令行输入jvisualvm。如果jdk安装正确的话(6.x以上版本),就会看到如下的一个窗口:

利用jdk自带的强悍工具jvisualvm检测多线程的竞争 - NobodyElse - 断尘居

看起来相当简洁,不像是很强大的样子。

 

2。运行一个Java程序IncTestN,jvisualvm会自动找到它

利用jdk自带的强悍工具jvisualvm检测多线程的竞争 - NobodyElse - 断尘居

3.右键点击它,”打开”

利用jdk自带的强悍工具jvisualvm检测多线程的竞争 - NobodyElse - 断尘居

可以看到它有很多标签页,可以让我们监测程序的各种数据。默认没有这么多,我其实安装了一些jvisualvm的插件。

4。查看jvm参数及系统属性

利用jdk自带的强悍工具jvisualvm检测多线程的竞争 - NobodyElse - 断尘居

5。查看cpu、内存、类、线程的统计数据

利用jdk自带的强悍工具jvisualvm检测多线程的竞争 - NobodyElse - 断尘居

注意,右边第一个还可以查看PermGen。对于scala程序,因为它产生了大量的类定义,所以PermGen有可能会不足,可通过该选项查看PermGen,适当调整:

利用jdk自带的强悍工具jvisualvm检测多线程的竞争 - NobodyElse - 断尘居

可以看到,对于本程序来说,PermGen还是比较充分的,无须调整。

6。查看各线程运行情况

这个是重点,我们需要知道各线程的运行情况,特别是否被synchronized阻塞了。

利用jdk自带的强悍工具jvisualvm检测多线程的竞争 - NobodyElse - 断尘居

注意右下角,有四个状态说明,分别是:

  1. 运行(Running):我们最喜欢的状态。说明该线程正在执行代码,没有问题。
  2. 休眠(Sleeping):调用了Thread.sleep后的状态,说明线程正停在某个Thread.sleep处
  3. 等待(Wait):手动调用了wait方法,或者某些IO操作,在阻塞中等待数据。
  4. 监视(Monitor):这里就是我想找的问题了。它表示线程想执行一段synchronized中的代码,但是发现已经有其它线程正在执行,自己被block了,只能无奈地等待。如果这种状态多,说明程序需要好好优化。

从上面的这个图可以看到,下面多个线程都处于”监视”状态。多个线程都卡在了独木桥的一头过不去,干不了活干着急呢。

当然这个程序是我专门设计成这样的,存在着严重的性能问题,需要好好优化。

7。查看各线程的统计数据

如果我们需要一些统计数据,比如某个线程总共运行了多少时间,”运行”状态有多久(或百分比),休眠、等待、监视有多久,则需要用到”表”这一页。

利用jdk自带的强悍工具jvisualvm检测多线程的竞争 - NobodyElse - 断尘居

从中可以看到这个悲催的程序,几分所有的时间都用在了synchronized的阻塞上了。只有百分之零点几的时间在运行中,效率可真低啊。

还可以使用图表方式来看这些数据,得到更直观的体验:

利用jdk自带的强悍工具jvisualvm检测多线程的竞争 - NobodyElse - 断尘居

8。查看各方法的运行时间

想不想程序中到底是哪些方法一直在运行?可使用”抽样器”功能:

利用jdk自带的强悍工具jvisualvm检测多线程的竞争 - NobodyElse - 断尘居

我们需要先点击上面的”CPU”按钮,它才会开始统计,下面的数据会慢慢多起来。从上图可以看出,程序一直在运行SynIncer.inc()方法,它占用了所有方法执行总时间的99.8%。如果我们想提高程序性能,则需要重点优化它,让它运行得更快。

还想知道方法被调用的次数?使用”Profiler”页中的功能:

利用jdk自带的强悍工具jvisualvm检测多线程的竞争 - NobodyElse - 断尘居

它与抽样器很像,但是最后多了一个”调用次数”。

9。查看哪些对象占用了最多的内存

当出现了内存不足的错误时,想不想知道到底是哪些对象把内存都占用了?这时需要使用”抽样器”的”内存”检测功能:

利用jdk自带的强悍工具jvisualvm检测多线程的竞争 - NobodyElse - 断尘居

从表中可以看出当前最多的是哪些对象,它们有多少个,用了多少个字节。

10。安装更多插件

jvisualvm还在线提供了很多插件,提供了更多的功能。我们可以通过”工具”->”插件”,找到并安装它们。推荐全装,比如我就安装了全部(当前有16个):

利用jdk自带的强悍工具jvisualvm检测多线程的竞争 - NobodyElse - 断尘居

安装重启后,再找到某个程序节点,就会发现有更多的标签页可用。

11。查看MBeans

MBeans可以将程序中的某些信息暴露给外部。有一些库在设计时,就考虑到了这一点。如果我们不满足于前面那些基础信息,可以在这里看看。

利用jdk自带的强悍工具jvisualvm检测多线程的竞争 - NobodyElse - 断尘居

由于当前程序没有使用到提供MBeans信息的库,所以看不到什么多少有用的信息。如果你使用了某些数据库连接池(提供了MBeans功能的),可以在这里看到池里的一些信息,还可以通过”Operations”标签页,对程序数据进行一些修改。

12。查看gc情况

垃圾回收是我们不能忽略的一个地方。我们可以通过”Visual GC”页,查看到非常详细的垃圾回收情况。

利用jdk自带的强悍工具jvisualvm检测多线程的竞争 - NobodyElse - 断尘居

可以说,这个功能提供的信息真是非常地详尽,连两个小Eden的情况也实时地表现出来了。不过要看懂这些数据,还是需要先到网上看看讲解Java垃圾回收的文章,了解其内部原理才行。

13。更多更详细的监测内容

Tracer页提供了更多的监测内容

利用jdk自带的强悍工具jvisualvm检测多线程的竞争 - NobodyElse - 断尘居

可以看到程序中遍布探针,让我们实时了解到各处的运行情况。先选中感兴趣的内容,然后点击”Start”按钮即可。

利用jdk自带的强悍工具jvisualvm检测多线程的竞争 - NobodyElse - 断尘居

这一块比较专业,普通开发人员可能都不知道这些数据到底有什么用。但专业人士可能会觉得会很需要它们。

JvisualVM的大部分功能都已经演示完了,我想它的功能的确很强大,在我们平时的开发中会非常有用。

分享到:
评论

相关推荐

    单线程与多线程

    至于工具有关,开发者可以利用各种线程分析工具来诊断和优化多线程程序,例如Java的JVisualVM,它可以显示线程状态,帮助找出死锁等问题。此外,内存分析工具,如Valgrind,可以帮助检测因线程不安全导致的内存泄漏...

    java多线程

    最后,工具在Java多线程开发中也起着重要作用,例如JVisualVM、JConsole等Java自带的监控工具,可以帮助开发者分析线程状态、检测死锁、查看内存使用情况等,从而更好地理解和优化多线程程序。 总之,Java多线程...

    线程监控工具,查找异常线程

    线程监控是软件开发中一个重要的环节,尤其是在多线程编程环境下,理解并管理线程的行为对于优化系统性能、防止死锁和资源竞争至关重要。本文将深入探讨线程监控工具的功能、用途,以及如何利用这些工具查找并解决...

    孙鑫Java无难事07

    线程同步是多线程编程中必须面对的问题,主要是为了避免数据竞争和保证数据一致性。Java提供了多种同步机制,如synchronized关键字、volatile变量、Lock接口(如ReentrantLock)以及java.util.concurrent包中的高级...

    第10章 高级事件(中)

    5. **信号量与互斥锁**:在多线程环境中,为了防止数据竞争,通常会使用同步机制如信号量和互斥锁。信号量控制资源的并发访问数量,互斥锁则确保同一时间只有一个线程可以访问共享资源。 6. **源码分析**:标签中...

    JAVA面试宝典.zip

    面试中可能涉及的知识点包括:基础语法、集合框架(List、Set、Map的区别与使用)、异常处理、多线程(同步机制、线程池)、IO流、反射、设计模式等。 2. **Redis**: Redis是一款高性能的键值存储系统,常用于缓存...

    反毛刺故障

    在处理反毛刺故障时,确保线程安全至关重要,因为毛刺可能源于多线程环境中的竞争条件或者不正确的同步机制。 1. **锁机制**:Java提供了`synchronized`关键字,可以用于保护临界区,避免多个线程同时访问同一资源...

    java抓哇教育面试资料

    - 多线程:线程的创建方式、同步机制(synchronized关键字、Lock接口)、并发工具类(如Semaphore、CountDownLatch)。 2. **Java高级特性** - 泛型:理解泛型的使用,类型擦除,通配符等。 - Lambda表达式:...

    Java-Interview-Advanced-master.zip

    2. **多线程** - **线程的创建与同步**:线程的实现方式(实现Runnable接口和继承Thread类),线程同步机制(synchronized关键字、wait/notify、Lock接口等)。 - **死锁、活锁与饥饿**:理解这些并发问题的定义、...

    JAVA面试题.rar

    4. **多线程** - **线程的创建**:通过Thread类或实现Runnable接口创建线程。 - **同步机制**:熟悉synchronized关键字、Lock接口(如ReentrantLock)及并发工具类(如Semaphore、CyclicBarrier)。 - **死锁**:...

    Practica3_PCTR_DependenciasEstados

    在Java中,可以使用多线程来实现并行性,例如通过`Thread`类、`Runnable`接口或`ExecutorService`框架。 2. **实时编程**:实时编程是指程序必须在预定的时间限制内完成其操作,否则可能导致系统故障。Java提供了...

    perf_exp:使用不同机制从多个来源获取数据的实验

    5. **多线程与并发**: 在Java中,多线程是常见的数据来源之一,性能分析可能包括对线程同步、竞态条件和死锁的检测。 6. **日志和追踪**: 应用程序可以通过日志记录关键操作,而Tracing框架(如Java Flight ...

    java程序员面试集合(我面试必看的)

    3. **多线程**: - **线程的创建方式**:通过Thread类和实现Runnable接口两种方式。 - **线程同步**:synchronized关键字,wait()、notify()和notifyAll()方法,以及Lock接口和ReentrantLock类的应用。 - **死锁...

    J.Heli:Little 2D-Helicopter-Game,来自 Java-Forum.org 的教程

    为了让游戏流畅运行,通常会使用多线程来分离图形渲染和游戏逻辑。在J.Heli中,你可能会学到如何使用Thread类或Runnable接口创建和管理线程,以及如何通过synchronized关键字来处理线程同步问题,防止数据竞争。 六...

    Where-Did-the-Time-Go:时间都去哪儿了 (WDTTG)

    - Java的`Thread`类和`ExecutorService`接口是进行多线程编程的基础,合理的线程调度和管理可以提高程序运行效率。 - `synchronized`关键字和`Lock`接口用于线程同步,防止数据竞争。 - `Concurrent`包提供了线程...

    rythmMusicApp:音乐应用

    音乐播放器模块通常包括播放、暂停、快进、倒退、音量控制等功能,这些可以通过Java的多线程和异步处理来实现流畅的用户体验。音乐库管理则涉及到文件I/O操作,Java的File类和流处理API能够方便地读取和存储音乐文件...

Global site tag (gtag.js) - Google Analytics