详解JVM中的本机内存跟踪

详解JVM中的本机内存跟踪

JVM内存管理机制中,本机内存是一个重要的概念。本机内存主要指的是JVM所管理的非Java堆内存。在本机内存中,主要包括了本地程序库、直接内存以及堆外内存。

在进行JVM内存跟踪和性能调优时,本机内存也是一个需要我们关注的维度。下文将详细讲解如何进行JVM中的本机内存跟踪。

本机内存的组成部分

JVM中的本机内存主要由以下几部分组成:

1. 本地程序库

本地程序库就是指使用本机语言(如C和C++)编写的动态链接库和静态链接库。对于Java程序而言,本地程序库通常用于提高性能或利用操作系统提供的接口。

如果在Java应用中使用了Java Native Interface(JNI),那么应用程序会与本地程序库进行交互。在JVM中,本地程序库被加载进特殊的本地内存区域中,被称为“native heap”。

2. 直接内存

直接内存是一种可以在JVM中直接使用的内存,它不受Java堆内存大小的限制,且在某些情况下可以提供更高的性能。

直接内存是通过Java NIO包中ByteBuffer的allocateDirect方法实现的。在创建一个ByteBuffer时,可以选择将其分配到Java堆内存中(使用allocate方法),或是分配到本地内存中(使用allocateDirect方法)。

对于前者,JVM会将分配到的堆内存缓存区转换成直接内存缓存区,并且JVM会在针对JVM堆内存进行垃圾回收的同时,也回收删除直接内存缓存区中的无用对象。

3. 堆外内存

堆外内存是指Java堆以外的内存空间,它也是直接内存的一种。与直接内存不同的是,堆外内存通常是在Java代码中通过Java NIO类库进行控制的。

与直接内存一样,堆外内存的申请和释放都不在JVM的控制范围之内,所以也不受JVM中内存管理机制所影响。此外,堆外内存的分配和回收速度相对较快,在大数据处理的场景下具有很好的应用前景。

本机内存跟踪工具

JVM中提供了jstat和jcmd两个命令可以用于监控本机内存使用状况。

1. jstat

jstat命令是JDK自带的一个命令,它可以帮助我们实现对JVM内存的实时监控。

使用jstat命令可以查看本机内存中Native Heap和Direct Memory的使用情况。

  • jstat -gccapacity :查看本机内存中Native Heap的使用情况,可以得出各代的容量、使用量、占比等信息。

  • jstat -gcutil :查看本机内存中各代的使用情况,可以得出各代的空间利用率、空间碎片率、对象分配数量等信息。

  • jstat -class :查看本机内存中的类加载信息,可以得出已加载的类数量、卸载的类数量等信息。

2. jcmd

jcmd命令是在JDK 1.7中引入的命令,它提供了一系列与JVM相关的操作,包括了显示GC概要、启动、停止、线程转储、堆转储、类直方图等。

使用jcmd命令可以查看本机内存中的直接内存使用情况。

  • jcmd VM.native_memory:查看本机内存中的直接内存使用情况,可以得出直接内存的大小、使用量、占比等信息。

示例1:jstat命令查看Native Heap使用情况

下面是一个使用jstat命令查看Native Heap使用情况的示例:

jstat -gccapacity <pid>

输出结果如下:

 NGCMN    NGCMX     NGC     S0C   S1C       EC      OGCMN      OGCMX       OGC         OC      S0     S1     YGC     YGCT    FGC    FGCT     GCT   
 165248.0 165248.0 165248.0  0.0 9688.0 129856.0   131072.0  524288.0   131072.0  131072.0  0.0 9688.0   2864   30.661   3     0.682   31.344

从结果中可以看到,本机内存中的Native Heap总容量为165248KB,Young区容量为 165248KB,Eden区容量为 129856KB,Survivor(S0/S1)区容量为 0KB/9688KB,Old区容量为 131072KB。

示例2:jcmd命令查看直接内存使用情况

下面是一个使用jcmd命令查看直接内存使用情况的示例:

jcmd <pid> VM.native_memory

输出结果如下:

Native Memory Tracking:

Total:                                56976720 KB

从结果中可以看到,本机内存中直接内存的大小为56976720KB,可以将其占比计算出。

结论

使用jstat和jcmd命令可以方便地查看JVM本机内存的使用情况,对性能调优非常有帮助。在真实的应用场景中可以根据实际情况使用相关命令。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解JVM中的本机内存跟踪 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • JDBC编程的详细步骤

    JDBC(Java Database Connectivity)是Java程序访问数据库的标准解决方案。下面,我将介绍JDBC编程的详细步骤,包括连接数据库、执行SQL语句等内容。 步骤一:导入JDBC驱动 通常情况下,你需要把特定数据库的JDBC驱动程序(JAR文件)导入到工程中,以便在程序中使用。不同数据库的JDBC驱动程序会有所不同,所以你需要确保使用…

    Java 2023年5月20日
    00
  • 详解基于java的Socket聊天程序——服务端(附demo)

    详解基于java的Socket聊天程序——服务端(附demo)攻略 1. 简介 本文将详细介绍如何使用Java中的Socket编写一个简单的聊天程序。文章分为客户端和服务端两部分,本文将着重讲解服务端的实现过程,并提供对应示例代码。 2. 整体流程 创建ServerSocket 等待客户端连接,创建Socket 创建线程处理客户端连接 服务端处理客户端的消息…

    Java 2023年5月19日
    00
  • Springboot如何使用Aspectj实现AOP面向切面编程

    下面我将为你详细讲解如何使用Aspectj实现AOP面向切面编程。 什么是AOP? AOP,全称为Aspect Oriented Programming,即面向切面编程。它是一种编程思想,与OOP(面向对象编程)相对。AOP的主要优势在于能够将系统中的横切关注点(例如日志输出、权限校验、事务管理等)与核心业务逻辑分离。从而方便开发复用性更强的组件。Aspec…

    Java 2023年5月19日
    00
  • jsp的九大内置对象深入讲解

    一、JSP九大内置对象 JSP的九大内置对象是指:1. request:封装客户端的请求,其中包含了与HTTP请求相关的信息,例如:请求参数、头信息等;2. response:封装服务器对客户端的响应,其中包含了HTTP响应本身以及向客户端发送的数据;3. pageContext:JSP页面上下文,包含了对该JSP页面的Servlet上下文、请求、响应等对象…

    Java 2023年6月15日
    00
  • Springboot之restTemplate的配置及使用方式

    Spring Boot之RestTemplate的配置及使用方式 在Spring Boot中,可以使用RestTemplate来发送HTTP请求。RestTemplate是Spring框架提供的一个用于访问RESTful服务的客户端工具,可以方便地发送HTTP请求并处理响应。本文将详细讲解RestTemplate的配置及使用方式,包括如何配置RestTemp…

    Java 2023年5月15日
    00
  • 告诉你springboot各个文件夹的作用

    Spring Boot是一个流行的Java框架,可以帮助开发人员更加高效地构建和部署应用程序。在Spring Boot项目中,有许多不同的文件夹,每个文件夹都有不同的作用。在本文中,我们将详细讲解Spring Boot各个文件夹的作用,并提供两个示例来演示如何使用这些文件夹。 Spring Boot各个文件夹的作用 以下是Spring Boot各个文件夹的作…

    Java 2023年5月15日
    00
  • Java 时间日期详细介绍及实例

    Java 时间日期详细介绍及实例 1. Java 时间日期简介 Java中用于表示时间和日期的主要类是java.util.Date类和java.util.Calendar类,从Java8开始还引入了新的日期时间API:java.time包,包含了一组全新的类用于时间日期的处理。 2. Java.util.Date类 java.util.Date是Java最早…

    Java 2023年5月20日
    00
  • Java spring的三种注入方式详解流程

    Java Spring的三种注入方式详解流程 在Java Spring中,有三种常用的依赖注入方式:构造函数注入、Setter方法注入以及字段注入。下面将分别给出这三种方式的详细讲解流程。 构造函数注入 步骤一:定义一个接口 首先,我们需要定义一个接口。这个接口将会被一个实现类所实现。在这个接口中,我们可以定义一些方法,让实现类去具体实现这些方法。 publ…

    Java 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部