当前位置:首页 > Web开发 > 正文

linux下jmap,jstat和jstack使用

2024-03-31 Web开发

Java堆和栈的区别 

栈与堆都是Java用来在Ram中存放数据的处所。与C++差别,Java自动打点栈和堆,措施员不能直接地设置栈或堆。 
Java的堆是一个运行时数据区,类的东西从中分配空间。这些东西通过new、newarray、anewarray和 multianewarray等指令成立,它们不需要措施代码来显式的释放。堆是由垃圾回收来卖力的,堆的优势是可以动态地分配内存巨细,保留期也不必事先报告编译器,因为它是在运行时动态分配内存的,Java的垃圾收集器会自动收走这些不再使用的数据。但错误谬误是,由于要在运行时动态分配内存,存取速度较慢。 

栈的优势是,存取速度比堆要快,仅次于寄存器,栈数据可以共享。但错误谬误是,存在栈中的数据巨细与保留期必需是确定的,缺乏灵活性。 

栈中主要存放一些根基类型的变量(,int, short, long, byte, float, double, boolean, char)和东西句柄。 
栈有一个很重要的特殊性,就是存在栈中的数据可以共享。假设我们同时界说: 
int a = 3; 
int b = 3; 
编译器先措置惩罚惩罚int a = 3;首先它会在栈中创建一个变量为a的引用,然后查找栈中是否有3这个值,如果没找到,就将3存放进来,然后将a指向3。接着措置惩罚惩罚int b = 3;在创建完b的引用变量后,因为在栈中已经有3这个值,便将b直接指向3。这样,就呈现了a与b同时均指向3的情况。 
这时,如果再令a=4;那么编译器会从头搜索栈中是否有4值,如果没有,则将4存放进来,并令a指向4;如果已经有了,则直接将a指向这个地点。因此a值的转变不会影响到b的值。 
要注意这种数据的共享与两个东西的引用同时指向一个东西的这种共享是差此外,因为这种情况a的改削并不会影响到b, 它是由编译器完成的,它有利于节省空间。而一个东西引用变量改削了这个东西的内部状态,会影响到另一个东西引用变量。

1.jstat

jstat -gcutil pid 5s

每隔5s监控一次内存回收情况

E 代表 Eden 区使用率;
O(Old)代表老年代使用率    ;
P(Permanent)代表永久代使用率;

CCS 压缩使用比例

M 元空间(MetaspaceSize)已使用的占当前容量百分比
YGC(Young GC)代表Minor GC 次数;
YGCT代表Minor GC耗时;
FGC(Full GC)代表Full GC次数;
FGCT(Full GC)代表Full GC耗时;
GCT代表Minor & Full GC共计耗时。

A、 jps(Java Virtual Machine Process Status Tool)      

jps主要用来输出JVM中运行的进程状态信息。语法格局如下:

jps [options] [hostid]

如果不指定hostid就默认为当前主机或处事器。

命令行参数选项说明如下:

 

-q 不输出类名、Jar名和传入main要领的参数

 

-m 输出传入main要领的参数

 

-l 输出main类或Jar的全限名

 

-v 输出传入JVM的参数

好比下面:

 

[email protected]:/# jps -m -l

 

2458 org.artifactory.standalone.main.Main /usr/local/artifactory-2.2.5/etc/jetty.xml

 

29920 com.sun.tools.hat.Main -port 9998 /tmp/dump.dat

 

3149 org.apache.catalina.startup.Bootstrap start

 

30972 sun.tools.jps.Jps -m -l

 

8247 org.apache.catalina.startup.Bootstrap start

 

25687 com.sun.tools.hat.Main -port 9999 dump.dat

 

21711 mrf-center.jar

B、 jstack

jstack -F pid 查抄是否有死锁

jstack主要用来检察某个Java进程内的线程仓库信息。语法格局如下:

 

jstack [option] pid

 

jstack [option] executable core

 

jstack [option] [[email protected]]remote-hostname-or-ip

命令行参数选项说明如下:

 

-l long listings,会打印出特别的锁信息,在发存亡锁时可以用jstack -l pid来不雅察看锁持有情况

 

-m mixed mode,不只会输出Java仓库信息,还会输出C/C++仓库信息(好比Native要领)

jstack可以定位到线程仓库,按照仓库信息我们可以定位到具体代码,所以它在JVM性能调优中使用得非常多。下面我们来一个实例找出某个Java进程中最耗费CPU的Java线程并定位仓库信息,用到的命令有ps、top、printf、jstack、grep。

第一步先找出Java进程ID,我部署在处事器上的Java应用名称为mrf-center:

 

[email protected]:/# ps -ef | grep mrf-center | grep -v grep

 

root     21711     1  1 14:47 pts/3    00:02:10 java -jar mrf-center.jar

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/web/33165.html