导航:首页 > 程序命令 > jvm线程常用命令

jvm线程常用命令

发布时间:2022-05-24 05:24:46

Ⅰ 如何查看jvm的"active thread

1.一个线程的集合,也可包含其他线程组
2.线程组构成一棵树,除了初始化线程组外,每一个线程组都有一个父线程组
3.允许线程访问有关自己的线程组的信息,但不能访问其父线程组或其他线程组的信息
4.ThreadGroup类只能获得处于运行状态的线程

常用方法:
activeCount() 返回线程组中活动线程的估计数
activeGroupCount() 返回线程组中活动线程组的估计数
enumerate(Thread[] list,boolean recurse) 把此线程组中所有活动线程复制到指定数组中
enumerate(ThreadGroup[] list,boolean recurse) 把此线程组中所有活动子组的引用复制到指定的数组中
enumerate(Thread[] list) 把此线程组中所有活动线程复制到指定数组中
enumerate(ThreadGroup[] list) 把此线程组中所有活动子组的引用复制到指定的数组中
getName() 返回此线程组的名称
getParent() 返回此线程组的父线程组

代码例子:
package com.xhj.thread;

import java.util.ArrayList;
import java.util.List;

/**
* 查看JVM中的线程 获取线程名和子线程组
*
* @author XIEHEJUN
*
*/
public class CheckThreadJVM {

/**
* 获取根线程组
*
* @return
*/
public static ThreadGroup getRootThreadGroup() {
ThreadGroup rootGroup = Thread.currentThread().getThreadGroup();
while (true) {
if (rootGroup.getParent() != null) {
rootGroup = rootGroup.getParent();
} else {
break;
}
}
return rootGroup;
}

/**
* 获取线程组中的线程名
*
* @param group
* @return
*/
public static List<String> getThreadsName(ThreadGroup group) {
List<String> threadList = new ArrayList<String>();
Thread[] threads = new Thread[group.activeCount()];
int count = group.enumerate(threads, false);
for (int i = 0; i < count; i++) {
threadList.add(group.getName() + "线程组: " + threads[i].getName());
}
return threadList;
}

/**
* 获取根数组下的子数组
*
* @param group
* @return
*/
public static List<String> getThreadGroup(ThreadGroup group) {
List<String> threadList = getThreadsName(group);
ThreadGroup[] threads = new ThreadGroup[group.activeGroupCount()];
int count = group.enumerate(threads, false);
for (int i = 0; i < count; i++) {
threadList.addAll(getThreadsName(threads[i]));
}
return threadList;

}

public static void main(String[] args) {
for (String string : getThreadGroup(getRootThreadGroup())) {
System.out.println(string);
}
}

}

Ⅱ JVM的线程状态及如何排查死锁原因

一般通过查看发生死锁时当时的内存占用情况找原因。具体的方式为:通过jmap或者jstat命令导出当前的mp日志,然后分析日志中线程执行情况和内存占用情况。常用命令如下:

// 打印出内存占用情况
jstat -gcutil 12564 1000 5

// 打印出内存占用情况
jmap -heap 12564

// 打印出jvm中各个资源占用情况,比较合适细节查找
jmap -histo 12564 | ./jmap -histo:live 12564 > /home/xxx/jvmmp.txt

// 打印出整个mp的信息(不建议,太复杂)
jmap -mp:format=b,file=/home/xxx/jvmallmp.txt 12564

//打印出各个内存分区的使用情况
jstat -gccapacity 12564

更多细节可以看看这个文章
blog.yemou.net/article/query/info/tytfjhfascvhzxcyt121

Ⅲ 怎么用linux命令查看jvm进程有几个线程

在LINUX上可以使用kill -3 pid > thread.info来取得当前JVM线程的信息;
jstack 这个是用来查看jvm当前的thread mp的。可以看到当前Jvm里面的线程状况。
这个对于查找blocked线程比较有意义;

Ⅳ jvm优化.有哪些jvm参数用过哪些jvm调优工具

JVM是最好的软件工程之一,它为Java提供了坚实的基础,许多流行语言如Kotlin、Scala、Clojure、Groovy都使用JVM作为运行基础。一个专业的Java工程师必须要了解并掌握JVM,接下来就给大家分享Java基础知识中JVM调优相关知识点。

杭州Java基础知识学习之JVM调优讲解

JVM常见的调优参数包括:

-Xmx:指定java程序的最大堆内存, 使用java -Xmx5000M -version判断当前系统能分配的最大堆内存;

-Xms:指定最小堆内存, 通常设置成跟最大堆内存一样,减少GC;

-Xmn:设置年轻代大小。整个堆大小=年轻代大小+年老代大小。所以增大年轻代后,将会减小年老代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8;

-Xss:指定线程的最大栈空间, 此参数决定了java函数调用的深度, 值越大调用深度越深, 若值太小则容易出栈溢出错误(StackOverflowError);

-XX:PermSize:指定方法区(永久区)的初始值,默认是物理内存的1/64,在Java8永久区移除, 代之的是元数据区,由-XX:MetaspaceSize指定;

-XX:MaxPermSize:指定方法区的最大值, 默认是物理内存的1/4,在java8中由-XX:MaxMetaspaceSize指定元数据区的大小;

-XX:NewRatio=n:年老代与年轻代的比值,-XX:NewRatio=2, 表示年老代与年轻代的比值为2:1;

-XX:SurvivorRatio=n:Eden区与Survivor区的大小比值,-XX:SurvivorRatio=8表示Eden区与Survivor区的大小比值是8:1:1,因为Survivor区有两个(from, to)。

JVM实质上分为三大块,年轻代(YoungGen),年老代(Old Memory),及持久代(Perm,在Java8中被取消)。

年轻代大小选择

响应时间优先的应用:尽可能设大,直到接近系统的最低响应时间限制(根据实际情况选择)。在此种情况下,年轻代收集发生的频率也是最小的。同时,减少到达年老代的对象。

吞吐量优先的应用:尽可能的设置大,可能到达Gbit的程度。因为对响应时间没有要求,垃圾收集可以并行进行,一般适合8CPU以上的应用。

年老代大小选择

响应时间优先的应用:年老代使用并发收集器,所以其大小需要小心设置,一般要考虑并发会话率和会话持续时间等一些参数。如果堆设置小了,可以会造成内存碎片、高回收频率以及应用暂停而使用传统的标记清除方式;如果堆大了,则需要较长的收集时间。最优化的方案,一般需要参考以下数据获得:并发垃圾收集信息、持久代并发收集次数、传统GC信息、花在年轻代和年老代回收上的时间比例。

减少年轻代和年老代花费的时间,一般会提高应用的效率。

吞吐量优先的应用:一般吞吐量优先的应用都有一个很大的年轻代和一个较小的年老代。原因是,这样可以尽可能回收掉大部分短期对象,减少中期的对象,而年老代尽存放长期存活对象。

较小堆引起的碎片问题

因为年老代的并发收集器使用标记、清除算法,所以不会对堆进行压缩。当收集器回收时,他会把相邻的空间进行合并,这样可以分配给较大的对象。但是,当堆空间较小时,运行一段时间以后,就会出现“碎片”,如果并发收集器找不到足够的空间,那么并发收集器将会停止,然后使用传统的标记、清除方式进行回收。如果出现“碎片”,可能需要进行如下配置:

-XX:+UseCMSCompactAtFullCollection:使用并发收集器时,开启对年老代的压缩。

-XX:CMSFullGCsBeforeCompaction=0:上面配置开启的情况下,这里设置多少次Full GC后,对年老代进行压缩。

Ⅳ java中多线程常见的几个参数

java中多线程常见的几个参数
sleep:在指定的毫秒数内让当前正在执行的线程休眠(暂停执行).
此操作受到系统计时器和调度程序精度和准确性的影响。
该线程不丢失任何监视器的所属权。
调用sleep的时候锁并没有被释放。
休眠
Java SE5引入了更加显示的sleep()作为TimeUnit类的一部分,这个方法允许你指定sleep()延迟的时间单元,因此可以提供更好的可阅读性。

wait:调用wait使线程挂起,直到线程得到了notify或notifyAll消息,线程才会进入就绪状态。
使你可以等待某个条件发生变化,而改变这个条件超出了当前方法的控制能力。
线程的执行被挂起,对象上的锁被释放。意味着另一个任务可以获得这个锁。
因此在该对象中的其他synchronized方法可以在wait期间被调用。

yield:相当于:我的工作已经做的差不多了,可以让给别的线程使用CPU了。
当调用yield时,你也是在建议具有相同优先级的其他线程可以运行。
对于任何重要的控制或在调整应用时,都不能依赖于yield。
yield并不意味着退出和暂停,只是,告诉线程调度如果有人需要,可以先拿去,我过会再执行,没人需要,我继续执行
调用yield的时候锁并没有被释放。

interrupt:中断线程。
Thread类包含interrupt()方法,因此你可以中止被阻塞的任务。
这个方法将设置线程的中断状态。
如果一个线程已经被阻塞,或者试图执行一个阻塞操作,那么设置这个线程的中断状态将抛出InterruptedException。
当抛出该异常或者该任何调用Thread.interrupted()时,中断状态将复位。
你在Executor上调用shutdownNow(),那么它将发送一个interrupt()调用给他启动的所有线程。

Ⅵ JVM调优jstack怎么找出最耗cpu的线程并定位代码

第一步:先找出java的进程Id(PID) 假设java应用名称是zcg_commodity
ps -ef|grep zcg_commodity

得到进程Id为32464
第二步:找出该进程内最消耗CPU的线程
top -Hp pid
输入top -Hp 32464

TIME列就是各个java线程耗费的CPU的时间,比如图中是线程ID的为2012的线程,
通过 printf “%x\n” 2012
得到2012的十六进制为 7dc
第三步:
一般会进到jdk的bin目录下,root权限执行
jstack 32464|grep 7dc

Ⅶ java线程的几个概念和方法

新建状态:用new语句创建的线程对象处于新建状态,此时它和其它的java对象一样,仅仅在堆中被分配了内存 就绪状态:当一个线程创建了以后,其他的线程调用了它的start()方法,该线程就进入了就绪状态。处于这个状态的线程位于可运行池中,等待获得CPU的使用权
运行状态:处于这个状态的线程占用CPU,执行程序的代码
阻塞状态:当线程处于阻塞状态时,java虚拟机不会给线程分配CPU,直到线程重新进入就绪状态,它才有机会转到运行状态。

阻塞状态分为三种情况:
1、 位于对象等待池中的阻塞状态:当线程运行时,如果执行了某个对象的wait()方法,java虚拟机就回把线程放到这个对象的等待池中
2、 位于对象锁中的阻塞状态,当线程处于运行状态时,试图获得某个对象的同步锁时,如果该对象的同步锁已经被其他的线程占用,JVM就会把这个线程放到这个对象的琐池中。
3、 其它的阻塞状态:当前线程执行了sleep()方法,或者调用了其它线程的join()方法,或者发出了I/O请求时,就会进入这个状态中。

Ⅷ JVM:如何分析线程堆栈

线程(thread),有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。由于线程之间的相互制约,致使线程在运行中呈现出间断性。线程也有就绪、阻塞和运行三种基本状态。

线程是程序中一个单一的顺序控制流程.在单个程序中同时运行多个线程完成不同的工作,称为多线程.
1、线程与进程

线程和进程的区别在于,子进程和父进程有不同的代码和数据空间,而多个线程则共享数据空间,每个线程有自己的执行堆栈和程序计数器为其执行上下文.多线程主要是为了节约CPU时间,发挥利用,根据具体情况而定. 线程的运行中需要使用计算机的内存资源和CPU

通常在一个进程中可以包含若干个线程,它们可以利用进程所拥有的资源。在引入线程的操作系统中,通常都是把进程作为分配资源的基本单位,而把线程作为独立运行和独立调度的基本单位。由于线程比进程更小,基本上不拥有系统资源,故对它的调度所付出的开销就会小得多,能更高效的提高系统内多个程序间并发执行的程度。

因而近年来推出的通用操作系统都引入了线程,以便进一步提高系统的并发性,并把它视为现代操作系统的一个重要指标。

Ⅸ 怎么通过linux命令去分析jvm里面那个线程阻塞了

仍然需要生成jvm进程的thread mp data,便于与Linux top命令输出关联。步骤如下:
1)执行top命令,或使用-H选项(显示所有线程),找到相关的高CPU的PID
2)生成thread mp 快照(kill -3 PID)。
3)将top命令输出PID转换为HEX格式(16进制)
4)在thread mp data中搜索nid=<Hex PID>
5)分析受影响的thread和stack trace,精确定位代码。
top output sample

[plain] view plain
PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME COMMAND
...........
22111 userWLS 9 0 86616 84M 26780 S 0.0 40.1 0:00 java

Ⅹ JVM线程状态都有哪几种

[1]新生状态(New):当一个线程的实例被创建即使用new关键字和Thread类或其子类创建一个线程对象后,此时该线程处于新生(new)状态,处于新生状态的线程有自己的内存空间,但该线程并没有运行,此时线程还不是活着的(notalive)。
[2]就绪状态(Runnable):通过调用线程实例的start()方法来启动线程使线程进入就绪状态(runnable);处于就绪状态的线程已经具备了运行条件,但还没有被分配到CPU即不一定会被立即执行,此时处于线程就绪队列,等待系统为其分配CPCU,等待状态并不是执行状态;此时线程是活着的(alive)。
[3]运行状态(Running):一旦获取CPU(被JVM选中),线程就进入运行(running)状态,线程的run()方法才开始被执行;在运行状态的线程执行自己的run()方法中的操作,直到调用其他的方法而终止、或者等待某种资源而阻塞、或者完成任务而死亡;如果在给定的时间片内没有执行结束,就会被系统给换下来回到线程的等待状态;此时线程是活着的(alive)。
[4]阻塞状态(Blocked):通过调用join()、sleep()、wait()或者资源被暂用使线程处于阻塞(blocked)状态;处于Blocking状态的线程仍然是活着的(alive)。
[5]死亡状态(Dead):当一个线程的run()方法运行完毕或被中断或被异常退出,该线程到达死亡(dead)状态。此时可能仍然存在一个该Thread的实例对象,当该Thread已经不可能在被作为一个可被独立执行的线程对待了,线程的独立的callstack已经被dissolved。一旦某一线程进入Dead状态,他就再也不能进入一个独立线程的生命周期了。对于一个处于Dead状态的线程调用start()方法,会出现一个运行期(runtimeexception)的异常;处于Dead状态的线程不是活着的(notalive)。

阅读全文

与jvm线程常用命令相关的资料

热点内容
女生喜欢玩的解压游戏 浏览:440
支付宝暗号加密操作 浏览:133
柯洁在哪个app下围棋 浏览:751
平板用什么app看内在美 浏览:609
cad计算机命令 浏览:173
邮箱设置域名服务器错误什么意思 浏览:671
硬盘解压失败受损蓝屏 浏览:654
应用和服务器是什么意思 浏览:485
程序员需要知道的网站 浏览:713
微信支付页面加密码怎么加 浏览:57
网络加密狗问题 浏览:698
cnc曲面编程实例 浏览:170
什么app零粉分发视频有收益 浏览:164
肯尼亚程序员 浏览:640
新科源码 浏览:661
如何判断服务器有没有带宽 浏览:44
天正建筑批量删除命令 浏览:96
cad最下面的一排命令都什么意思 浏览:456
pythonimportcpp 浏览:852
W10的系统怎么给U盘加密 浏览:372