使用OneAPM监控JVM

本文主要介绍JVMs栏目的主要功能。

 

  1. JVM-内存
  2. JVM-线程
  3. JVM-会话

 

1. JVM-内存

路径:应用程序 > 监控 > JVMs > 内存

介绍:该栏目主要展示了JVM的(非)堆内存使用量、垃圾收集和类加载情况。

上图展示了Java应用中的Heap Memory和Non Heap Memory分布图。

Java 的内存通常分为堆内存和非堆内存,堆内存由 Java 对象使用,非堆内存则用于存放 JNI、Java 线程对象等非 Java 数据。

 

上图依次展示了Java堆的中、老、新三代分布。一般,堆的组成有如下三个区域:

1、新生代 Young Generation

  1.1 Eden Space 任何新进入运行时数据区域的实例都会存放在此

  2.1 S0 Suvivor Space 存在时间较长,经过垃圾回收没有被清除的实例,就从Eden 搬到了S0

  3.1 S1 Survivor Space 同理,存在时间更长的实例,就从S0 搬到了S1

2.旧生代 Old Generation/tenured

  同理,存在时间更长的实例,对象多次回收没被清除,就从S1 搬到了tenured

3.Perm (持久代)存放加载的类和方法对象

为了方便起见,OneAPM设置了中、老、新三张堆分布图。

 

上图分别展示了垃圾收集和类加载情况图。

 

其中,垃圾收集基于JVM分代回收(Generational Collection)原理:把对象分为年青代(Young)、年老代(Tenured)、持久代(Perm),对不同生命周期的对象使用不同的算法。

此外,关于类加载(Class loader):

JVM 主要包括两个子系统和两个组件。两个子系统分别是 Class loader 子系统和Execution engine(执行引擎) 子系统;两个组件分别是 Runtime data area (运行时数据区域)组件和 Native interface(本地接口)组件。

Class loader 子系统的作用:根据给定的全限定名类名(如 java.lang.Object)来装载 class 文件的内容到 Runtime data area 中的 method area(方法区域)。Java 程序员可以 extends java.lang.ClassLoader 类来写自己的 Class loader。

因此,对类加载情况的监控对Java应用而言是很重要的。

 

2. JVM-线程

 

路径:应用程序 > 监控 > JVMs > 线程

 

 

线程,作为程序运行的基本执行单元,对其的监控必不可少。上图展示了线程数量的动态变化,以及线程池中不同状态的线程分布。

 

3. JVM-会话

 

路径:应用程序 > 监控 > JVMs > 会话

 

根据不同的场景,会话的定义亦有所不同:在Web应用的用户眼中,打开浏览器访问电子商务网站,登陆并完成购物再关闭浏览器,是一个会话;而在Web应用开发者眼中,用户登陆时,需要为此创建一个数据结构以存储其登陆信息,该结构也是一个会话。

 

会话,作为解决HTTP协议自身无状态的方法之一,对应用的影响巨大。上图展示了OneAPM对会话的监控形式。

还有其他问题? 提交请求

您还可以采取以下方式解决问题: