8. JVM虚拟机-性能监控和故障处理工具

目录

1. JVM参数

1.1 、参数分类

2、SunJDK监控和故障处理工具

2.1 jps

2.2 jstat

2.2.1 -class 

2.2.2 -compiler

2.2.3 -gc

2.2.4 -gccapacity

2.2.5 -gcutil

2.2.6 -gccause

2.2.7 -gcnew

2.2.8 -gcnewcapacity

2.2.9 -gcold

2.2.10 -gcoldcapacity

2.2.11 -gcpermcapacity

2.2.12 -printcompilation

2.3 jmap

2.3.1 -dump

2.3.2 -finalizerinfo

2.3.4 -heap

2.3.5 -histo

2.3.6 -permstat

2.4 jstack

2.5 jinfo 

3. VisualVM

3.1 介绍

3.2 远程连接

3.2.1 离线插件安装

3.2.2 jstatd远程连接:

3.2.3 JMX安装

4. 线上利器-Arthas

4.1 介绍

4.2 常用命令

4.2.1 dashboard

数据说明

4.2.2 thread

4.2.3 JVM

4.3.3 其余实时查看官网


1. JVM参数

1.1 、参数分类

  1. 标准参数 :功能和输出的参数都是很稳定的 在未来的JVM版本中不会改变 可以使用java -help检索出所有的标准参数
  2. X参数:非标准化参数 在未来的版本可能会改变 所有的参数都用-X开始 可以使用java -X检索 但是注意没有-Xcomp
  3. XX参数 :非标准 很长一段时间不会列出来 用于JVM开发的debug和调优

2、SunJDK监控和故障处理工具

2.1 jps

JVM Process Status Tool,显示指定系统内所有的HotSpot虚拟机进程。 

命令格式

  jps [options] [hostid]

option参数

-l : 输出主类全名或jar路径

-q : 只输出LVMID

-m : 输出JVM启动时传递给main()的参数

-v : 输出JVM启动时显示指定的JVM参数

 

2.2 jstat

jstat(JVM statistics Monitoring)是用于监视虚拟机运行时状态信息的命令,它可以显示出虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据。

  jstat [option] LVMID [interval] [count]

option 参数总览 

[option] : 操作参数

LVMID : 本地虚拟机进程ID

[interval] : 连续输出的时间间隔

[count] : 连续输出的次数

 

2.2.1 -class 

监视类装载、卸载数量、总空间以及耗费的时间

  $ jstat -class 11589
   Loaded  Bytes  Unloaded  Bytes     Time   
    7035  14506.3     0     0.0       3.67

Loaded : 加载class的数量
Bytes : class字节大小
Unloaded : 未加载class的数量
Bytes : 未加载class的字节大小
Time : 加载时间

 

2.2.2 -compiler

输出JIT编译过的方法数量耗时等

  $ jstat -compiler 1262
  Compiled Failed Invalid   Time   FailedType FailedMethod
      2573      1       0    47.60          1 org/apache/catalina/loader/WebappClassLoader findResourceInternal  


Compiled : 编译数量
Failed : 编译失败数量
Invalid : 无效数量
Time : 编译耗时
FailedType : 失败类型
FailedMethod : 失败方法的全限定名

 

2.2.3 -gc

垃圾回收堆的行为统计,常用命令

  $ jstat -gc 1262
   S0C    S1C     S0U     S1U   EC       EU        OC         OU        PC       PU         YGC    YGCT    FGC    FGCT     GCT   
  26112.0 24064.0 6562.5  0.0   564224.0 76274.5   434176.0   388518.3  524288.0 42724.7    320    6.417   1      0.398    6.815

S0C : survivor0区的总容量

S1C : survivor1区的总容量

S0U : survivor0区已使用的容量

S1U : survivor1区已使用的容量

EC : Eden区的总容量

EU : Eden区已使用的容量

OC : Old区的总容量

OU : Old区已使用的容量PC 当前perm的容量 (KB) PU perm的使用 (KB)

YGC : 新生代垃圾回收次数

YGCT : 新生代垃圾回收时间

FGC : 老年代垃圾回收次数

FGCT : 老年代垃圾回收时间

GCT : 垃圾回收总消耗时间

2.2.4 -gccapacity

同-gc,不过还会输出Java堆各区域使用到的最大、最小空间

  $ jstat -gccapacity 1262
   NGCMN    NGCMX     NGC    S0C   S1C       EC         OGCMN      OGCMX      OGC        OC       PGCMN    PGCMX     PGC      PC         YGC    FGC 
  614400.0 614400.0 614400.0 26112.0 24064.0 564224.0   434176.0   434176.0   434176.0   434176.0 524288.0 1048576.0 524288.0 524288.0    320     1  
NGCMN : 新生代占用的最小空间

NGCMX : 新生代占用的最大空间

OGCMN : 老年代占用的最小空间

OGCMX : 老年代占用的最大空间

OGC:当前年老代的容量 (KB)

OC:当前年老代的空间 (KB)

PGCMN : perm占用的最小空间

PGCMX : perm占用的最大空间

 

2.2.5 -gcutil

同-gc,不过输出的是已使用空间占总空间的百分比

  $ jstat -gcutil 28920
    S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT   
   12.45   0.00  33.85   0.00   4.44  4       0.242     0    0.000    0.242
  $ jstat -gcutil 28920
    S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT   
   12.45   0.00  33.85   0.00   4.44  4       0.242     0    0.000    0.242

2.2.6 -gccause

垃圾收集统计概述(同-gcutil),附加最近两次垃圾回收事件的原因

  $ jstat -gccause 28920
    S0     S1     E      O      P       YGC     YGCT    FGC    FGCT     GCT    LGCC                 GCC                 
   12.45   0.00  33.85   0.00   4.44      4    0.242     0    0.000    0.242   Allocation Failure   No GC  
LGCC:最近垃圾回收的原因

GCC:当前垃圾回收的原因

2.2.7 -gcnew

统计新生代的行为

  $ jstat -gcnew 28920
   S0C      S1C      S0U        S1U  TT  MTT  DSS      EC        EU         YGC     YGCT  
   419392.0 419392.0 52231.8    0.0  6   6    209696.0 3355520.0 1172246.0  4       0.242
TT:Tenuring threshold(提升阈值)

MTT:最大的tenuring threshold

DSS:survivor区域大小 (KB)

2.2.8 -gcnewcapacity

新生代与其相应的内存空间的统计

  $ jstat -gcnewcapacity 28920
    NGCMN      NGCMX       NGC      S0CMX     S0C     S1CMX     S1C       ECMX        EC        YGC   FGC 
   4194304.0  4194304.0  4194304.0 419392.0 419392.0 419392.0 419392.0  3355520.0  3355520.0     4     0

 

NGC:当前年轻代的容量 (KB)

S0CMX:最大的S0空间 (KB)

S0C:当前S0空间 (KB)

ECMX:最大eden空间 (KB)

EC:当前eden空间 (KB)

2.2.9 -gcold

统计旧生代的行为

  $ jstat -gcold 28920
     PC       PU        OC           OU       YGC    FGC    FGCT     GCT   
  1048576.0  46561.7   6291456.0     0.0      4      0      0.000    0.242

 

2.2.10 -gcoldcapacity

统计旧生代的大小和空间

  $ jstat -gcoldcapacity 28920
     OGCMN       OGCMX        OGC         OC         YGC   FGC    FGCT     GCT   
    6291456.0   6291456.0   6291456.0   6291456.0     4     0    0.000    0.242

 

2.2.11 -gcpermcapacity

永生代行为统计

  $ jstat -gcpermcapacity 28920
      PGCMN      PGCMX       PGC         PC      YGC   FGC    FGCT     GCT   
   1048576.0  2097152.0  1048576.0  1048576.0     4     0    0.000    0.242

 

2.2.12 -printcompilation

hotspot编译方法统计

  $ jstat -printcompilation 28920
      Compiled  Size  Type Method
      1291      78     1    java/util/ArrayList indexOf
Compiled:被执行的编译任务的数量

Size:方法字节码的字节数

Type:编译类型

Method:编译方法的类名和方法名。类名使用”/” 代替 “.” 作为空间分隔符. 方法名是给出类的方法名. 格式是一致于HotSpot - XX:+PrintComplation 选项

 

 

2.3 jmap

jmap(JVM Memory Map)命令用于生成heap dump文件,如果不使用这个命令,还阔以使用-XX:+HeapDumpOnOutOfMemoryError参数来让虚拟机出现OOM的时候·自动生成dump文件。 jmap不仅能生成dump文件,还阔以查询finalize执行队列、Java堆和永久代的详细信息,如当前使用率、当前使用的是哪种收集器等。
 

  jmap [option] LVMID
dump : 生成堆转储快照

finalizerinfo : 显示在F-Queue队列等待Finalizer线程执行finalizer方法的对象

heap : 显示Java堆详细信息

histo : 显示堆中对象的统计信息

permstat : to print permanent generation statistics

F : 当-dump没有响应时,强制生成dump快照

 

2.3.1 -dump

jmap -dump::live,format=b,file=<filename> pid 

dump堆到文件,format指定输出格式,live指明是活着的对象,file指定文件名

  $ jmap -dump:live,format=b,file=dump.hprof 28920
    Dumping heap to /home/xxx/dump.hprof ...
    Heap dump file created

 dump.hprof这个后缀是为了后续可以直接用MAT(Memory Anlysis Tool)打开

2.3.2 -finalizerinfo

打印等待回收对象的信息,可以看到当前F-QUEUE队列中并没有等待Finalizer线程执行finalizer方法的对象。

  $ jmap -finalizerinfo 28920
    Attaching to process ID 28920, please wait...
    Debugger attached successfully.
    Server compiler detected.
    JVM version is 24.71-b01
    Number of objects pending for finalization: 0

 

2.3.4 -heap

打印heap的概要信息,GC使用的算法,heap的配置及wise heap的使用情况,可以用此来判断内存目前的使用情况以及垃圾回收情况

  $ jmap -heap 28920
    Attaching to process ID 28920, please wait...
    Debugger attached successfully.
    Server compiler detected.
    JVM version is 24.71-b01  
  ​
    using thread-local object allocation.
    Parallel GC with 4 thread(s)//GC 方式  
  ​
    Heap Configuration: //堆内存初始化配置
       MinHeapFreeRatio = 0 //对应jvm启动参数-XX:MinHeapFreeRatio设置JVM堆最小空闲比率(default 40)
       MaxHeapFreeRatio = 100 //对应jvm启动参数 -XX:MaxHeapFreeRatio设置JVM堆最大空闲比率(default 70)
       MaxHeapSize      = 2082471936 (1986.0MB) //对应jvm启动参数-XX:MaxHeapSize=设置JVM堆的最大大小
       NewSize          = 1310720 (1.25MB)//对应jvm启动参数-XX:NewSize=设置JVM堆的‘新生代’的默认大小
       MaxNewSize       = 17592186044415 MB//对应jvm启动参数-XX:MaxNewSize=设置JVM堆的‘新生代’的最大大小
       OldSize          = 5439488 (5.1875MB)//对应jvm启动参数-XX:OldSize=<value>:设置JVM堆的‘老生代’的大小
       NewRatio         = 2 //对应jvm启动参数-XX:NewRatio=:‘新生代’和‘老生代’的大小比率
       SurvivorRatio    = 8 //对应jvm启动参数-XX:SurvivorRatio=设置年轻代中Eden区与Survivor区的大小比值 
       PermSize         = 21757952 (20.75MB)  //对应jvm启动参数-XX:PermSize=<value>:设置JVM堆的‘永生代’的初始大小
       MaxPermSize      = 85983232 (82.0MB)//对应jvm启动参数-XX:MaxPermSize=<value>:设置JVM堆的‘永生代’的最大大小
       G1HeapRegionSize = 0 (0.0MB)  
  ​
    Heap Usage://堆内存使用情况
    PS Young Generation
    Eden Space://Eden区内存分布
       capacity = 33030144 (31.5MB)//Eden区总容量
       used     = 1524040 (1.4534378051757812MB)  //Eden区已使用
       free     = 31506104 (30.04656219482422MB)  //Eden区剩余容量
       4.614088270399305% used //Eden区使用比率
    From Space:  //其中一个Survivor区的内存分布
       capacity = 5242880 (5.0MB)
       used     = 0 (0.0MB)
       free     = 5242880 (5.0MB)
       0.0% used
    To Space:  //另一个Survivor区的内存分布
       capacity = 5242880 (5.0MB)
       used     = 0 (0.0MB)
       free     = 5242880 (5.0MB)
       0.0% used
    PS Old Generation //当前的Old区内存分布
       capacity = 86507520 (82.5MB)
       used     = 0 (0.0MB)
       free     = 86507520 (82.5MB)
       0.0% used
    PS Perm Generation//当前的 “永生代” 内存分布
       capacity = 22020096 (21.0MB)
       used     = 2496528 (2.3808746337890625MB)
       free     = 19523568 (18.619125366210938MB)
       11.337498256138392% used  
  ​
    670 interned Strings occupying 43720 bytes.

2.3.5 -histo

打印堆的对象统计,包括对象数、内存大小等等 (因为在dump:live前会进行full gc,如果带上live则只统计活对象,因此不加live的堆大小要大于加live堆的大小 )

  $ jmap -histo:live 28920 | more
   num     #instances         #bytes  class name
  ----------------------------------------------
     1:         83613       12012248  <constMethodKlass>
     2:         23868       11450280  [B
     3:         83613       10716064  <methodKlass>
     4:         76287       10412128  [C
     5:          8227        9021176  <constantPoolKlass>
     6:          8227        5830256  <instanceKlassKlass>
     7:          7031        5156480  <constantPoolCacheKlass>
     8:         73627        1767048  java.lang.String
     9:          2260        1348848  <methodDataKlass>
    10:          8856         849296  java.lang.Class
    ....

2.3.6 -permstat

打印Java堆内存的永久保存区域的类加载器的智能统计信息。对于每个类加载器而言,它的名称、活跃度、地址、父类加载器、它所加载的类的数量和大小都会被打印。此外,包含的字符串数量和大小也会被打印。

  $ jmap -permstat 28920
    Attaching to process ID 28920, please wait...
    Debugger attached successfully.
    Server compiler detected.
    JVM version is 24.71-b01
    finding class loader instances ..done.
    computing per loader stat ..done.
    please wait.. computing liveness.liveness analysis may be inaccurate ...
    
    class_loader            classes bytes   parent_loader           alive?  type  
    <bootstrap>             3111    18154296          null          live    <internal>
    0x0000000600905cf8      1       1888    0x0000000600087f08      dead    sun/reflect/DelegatingClassLoader@0x00000007800500a0
    0x00000006008fcb48      1       1888    0x0000000600087f08      dead    sun/reflect/DelegatingClassLoader@0x00000007800500a0
    0x00000006016db798      0       0       0x00000006008d3fc0      dead    java/util/ResourceBundle$RBClassLoader@0x0000000780626ec0
    0x00000006008d6810      1       3056      null          dead    sun/reflect/DelegatingClassLoader@0x00000007800500a0

2.4 jstack

jstack用于生成java虚拟机当前时刻的线程快照。线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等。 线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做什么事情,或者等待什么资源。 如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java stack和native stack的信息,从而可以轻松地知道java程序是如何崩溃和在程序何处发生问题。另外,jstack工具还可以附属到正在运行的java程序中,看到当时运行的java程序的java stack和native stack的信息, 如果现在运行的java程序呈现hung的状态,jstack是非常有用的。

  jstack [option] LVMID
-F : 当正常输出请求不被响应时,强制输出线程堆栈

-l : 除堆栈外,显示关于锁的附加信息

-m : 如果调用到本地方法的话,可以显示C/C++的堆栈
  $ jstack -l 11494|more
  2016-07-28 13:40:04
  Full thread dump Java HotSpot(TM) 64-Bit Server VM (24.71-b01 mixed mode):
  ​
  "Attach Listener" daemon prio=10 tid=0x00007febb0002000 nid=0x6b6f waiting on condition [0x0000000000000000]
     java.lang.Thread.State: RUNNABLE
  ​
     Locked ownable synchronizers:
          - None
  ​
  "http-bio-8005-exec-2" daemon prio=10 tid=0x00007feb94028000 nid=0x7b8c waiting on condition [0x00007fea8f56e000]
     java.lang.Thread.State: WAITING (parking)
          at sun.misc.Unsafe.park(Native Method)
          - parking to wait for  <0x00000000cae09b80> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
          at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
          at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2043)
          at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
          at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:104)
          at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:32)
          at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1068)
          at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
          at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
          at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
          at java.lang.Thread.run(Thread.java:745)
  ​
     Locked ownable synchronizers:
          - None
        .....

详细可参照《https://www.hollischuang.com/archives/110

 

2.5 jinfo 

jinfo(JVM Configuration info)这个命令作用是实时查看和调整虚拟机运行参数。 之前的jps -v口令只能查看到显示指定的参数,如果想要查看未被显示指定的参数的值就要使用jinfo口令

  jinfo [option] [args] LVMID
-flag : 输出指定args参数的值

-flags : 不需要args参数,输出所有JVM参数的值

-sysprops : 输出系统属性,等同于System.getProperties()

 

3. VisualVM

3.1 介绍

VisualVM 是一个工具,它提供了一个可视界面,用于查看 Java 虚拟机 (Java Virtual Machine, JVM) 上运行的基于 Java 技术的应用程序(Java 应用程序)的详细信息。VisualVM 对 Java Development Kit (JDK) 工具所检索的 JVM 软件相关数据进行组织,并通过一种使您可以快速查看有关多个 Java 应用程序的数据的方式提供该信息。您可以查看本地应用程序以及远程主机上运行的应用程序的相关数据。此外,还可以捕获有关 JVM 软件实例的数据,并将该数据保存到本地系统,以供后期查看或与其他用户共享。
 

VisualVM 是javajdk自带的最牛逼的调优工具,也是我平时使用最多调优工具,几乎涉及了jvm调优的方方面面。同样是在jdk/bin目录下面双击jvisualvm.exe既可使用,启动起来后和jconsole 一样同样可以选择本地和远程,如果需要监控远程同样需要配置相关参数,主界面如下;

 

3.2 远程连接

3.2.1 离线插件安装

查看虚拟机版本:

[root@xnj6 bin]# java -version
java version "1.8.0_172"
Java(TM) SE Runtime Environment (build 1.8.0_172-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.172-b11, mixed mode)

 在 https://visualvm.github.io/pluginscenters.html 找到对应插件版本,如下图进行插件的安装

 

要实现远程监控Java进程,必须在远程主机(运行Java程序的主机)上跑一个jstatd进程,这个进程相当于一个agent,用来收集远程主机上的JVM运行情况,然后用VisualVm连接到这个jstatd,从而实现远程监控的目的。

3.2.2 jstatd远程连接:

第一步:在远程主机上启动jstatd

要注意的是,jstatd是一个RMI server application,因此在启动时支持java.rmi properties

根据jstatd文档,我们需要在启动jstatd时提供一个security policy文件:

grant codebase "file:${java.home}/../lib/tools.jar" {   
    permission java.security.AllPermission;
};
jstatd -J-Djava.security.policy=jstatd.all.policy -J-Djava.rmi.server.hostname=192.168.9.16

 

远程主机的hostname可以随便填,只要VisualVm能够ping通这个hostname就行了。所以说下面这几种情况都是可行的:

  • 远程主机没有DNS name,但VisualVm所在主机的/etc/hosts里配置了some-name <ip-to-remote-host>。jstatd启动时指定-J-Djava.rmi.server.hostname=some-name,VisualVm连接some-name
  • 远程主机经过层层NAT,它的内部ip比如是192.168.xxx.xxx,它的对外的NAT地址是172.100.xxx.xxx。jstatd启动时指定-J-Djava.rmi.server.hostname=172.100.xxx.xxx,VisualVm连接172.100.xxx.xxx
  • 上面两种方式混合,即在VisualVm所在主机的/etc/hosts里配置some-name <ip-to-remote-host-nat-address>。jstatd启动时指定-J-Djava.rmi.server.hostname=some-name,VisualVm连接some-name

还有要注意一点,运行jstatd的用户必须和运行Java程序的用户相同,或者是root,否则会监控不到远程主机上的Java进程。

第二步:启动VisualVm

 

 

需要注意的是如果你点开一个远程进程,那么你会发现有些信息是没有的,比如:CPU、线程、和MBeans。这就需要安装

3.2.3 JMX安装

使用下面命令启动tomcat,复制时小心,不允许换行

CATALINA_OPTS='-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.port=1
100 -Dcom.sun.management.jmxremote.rmi.port=1100 -Djava.rmi.server.hostname=192.168.9.16' ./startup.sh

再启动jstatd

jstatd -J-Djava.security.policy=jstatd.all.policy -J-Djava.rmi.server.hostname=192.168.9.16

 在页面添加JMX连接

下面就可以看到相关信息了

上面内容参照一下博客,感谢

https://blog.csdn.net/happyniceyq/article/details/82924588

https://segmentfault.com/a/1190000016634627

https://segmentfault.com/a/1190000016636787

4. 线上利器-Arthas

4.1 介绍

Arthas 是Alibaba开源的Java诊断工具,Arthas 用户文档 

4.2 常用命令

4.2.1 dashboard

当前系统的实时数据面板,按 ctrl+c 退出

数据说明

  • ID: Java级别的线程ID,注意这个ID不能跟jstack中的nativeID一一对应

  • NAME: 线程名

  • GROUP: 线程组名

  • PRIORITY: 线程优先级, 1~10之间的数字,越大表示优先级越高

  • STATE: 线程的状态

  • CPU%: 线程消耗的cpu占比,采样100ms,将所有线程在这100ms内的cpu使用量求和,再算出每个线程的cpu使用占比。

  • TIME: 线程运行总时间,数据格式为分:秒

  • INTERRUPTED: 线程当前的中断位状态

  • DAEMON: 是否是daemon线程

4.2.2 thread

查看当前线程信息,查看线程的堆栈,同JVM的jstack类似,更方便智能。

#当没有参数时,显示所有线程的信息
$ thread

#支持一键展示当前最忙的前N个线程并打印堆栈
$ thread -n 3

显示指定线程的运行堆栈
$ thread 1(thread id)

#找出当前阻塞其他线程的线程
$ thread -b

#指定采样时间间隔
$ thread -n 3 -i 1000

#查看指定状态的线程
$thread --state WAITING

 

4.2.3 JVM

查看当前JVM信息;

THREAD相关

  • COUNT: JVM当前活跃的线程数

  • DAEMON-COUNT: JVM当前活跃的守护线程数

  • PEAK-COUNT: 从JVM启动开始曾经活着的最大线程数

  • STARTED-COUNT: 从JVM启动开始总共启动过的线程次数

  • DEADLOCK-COUNT: JVM当前死锁的线程数

文件描述符相关

  • MAX-FILE-DESCRIPTOR-COUNT:JVM进程最大可以打开的文件描述符数

  • OPEN-FILE-DESCRIPTOR-COUNT:JVM当前打开的文件描述符数

4.3.3 其余实时查看官网

Arthas 用户文档 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当谈到 JVM 监控的背景时,可以从以下几个方面进行细化: 1. JVM 运行时环境:JVM(Java虚拟机)是Java平台的核心组件,负责将Java字节码转换成机器码并执行。JVM提供了一些内置的监控工具和API,用于收集和报告有关应用程序性能和行为的信息。 2. 应用程序复杂性增加:随着应用程序的复杂性不断增加,尤其是在大规模和分布式系统中,需要对JVM进行监控来了解应用程序的性能和行为。监控可以帮助开发人员识别和解决性能问题、内存泄漏、线程问题等。 3. 性能优化需求:对于企业级应用程序而言,性能是关键指标之一。通过监控JVM,可以了解应用程序的资源利用情况、瓶颈点以及优化潜力。这有助于开发人员进行性能调优,提高应用程序的响应时间和吞吐量。 4. 故障排查和容错能力:当应用程序发生故障或异常时,监控JVM可以提供宝贵的信息来帮助定位问题。通过监控内存、线程、日志等指标,可以追踪异常发生的原因,并采取适当的措施来修复问题,提高应用程序的可靠性和稳定性。 5. 资源管理和容量规划:监控JVM可以提供关于资源使用情况的实时数据,如内存、CPU、磁盘等。这有助于进行容量规划,预测未来的资源需求,并确保应用程序在高负载情况下仍能正常运行。 总而言之,JVM监控的背景可以归结为应对应用程序复杂性增加、性能优化需求、故障排查和容错能力、资源管理和容量规划等方面的需求。通过监控JVM,开发人员和运维人员能够获得关键的运行时数据,以便更好地管理、维护和优化应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值