Java类MemoryUsage查看虚拟机的使用情况

 

Arthas 是阿里巴巴开源的一款监控java进程的工具,可以有效监控CPU、内存使用情况,更厉害的是可以帮助开发人员深入排查java代码的问题,比如java进程占用cpu过高是哪一个线程执行哪一个类的哪一个方法出的问题

首先,先给大家普及一下Arthas的使用步骤:

Step1 下载安装:
在线安装方式: curl -O https://alibaba.github.io/arthas/arthas-boot.jar
离线方式:到github下载对应的已发布的稳定的jar包 https://github.com/alibaba/arthas/tree/arthas-all-3.1.7
Step2 启动:
java -jar arthas-boot.jar
启动成功后如下图所示:

 

上图界面可以看到检测到了16个java进程,其中一个不可用;默认当前会话选中的是第一个进程:3968

如果需要切换到其他进程怎么办呢?
直接输入对应的进程编号即可,如下图所示:

 

 从图中效果可以发现,虽然已经Attach捕获进程成功,但是当前进程还是之前的会话进程3968,这是Arthas的一个坑
很简单解决此问题,如下图所示步骤:
先关闭当前会话,然后再重启arthas,

 

 

 

 

如此以上两个步骤即可解决这个坑人的问题~~

下面是简单列举下常用的命令:
命令:dashboard 当前系统的实时数据状态看板,线程的cpu占用情况,内存的消耗和垃圾回收情况等

 

 

命令:sc 查看JVM已加载的类信息

 

 命令:sm 查看已加载类的方法信息

 

 


命令:trace 定位方法内部代码块性能耗时情况

 

 命令:thread 显示所有线程的信息

 

 



thread -n 3 展示当前最忙的前N个线程并打印堆栈

 

 

就此为止,想查看更多的命令解释,请参见官方文档
https://alibaba.github.io/arthas/commands.html



 

 

 

原文地址:https://www.cnblogs.com/xubiao/p/5465473.html

Java类MemoryUsage,通过MemoryUsage可以查看Java 虚拟机的内存池的内存使用情况。

MemoryUsage类有四个值(均以字节为单位):

Init:java虚拟机在启动的时候向操作系统请求的初始内存容量,java虚拟机在运行的过程中可能向操作系统请求更多的内存或将内存释放给操作系统,所以init的值是不确定的。

Used:当前已经使用的内存量。

Committed:表示保证java虚拟机能使用的内存量,已提交的内存量可以随时间而变化(增加或减少)。Java 虚拟机可能会将内存释放给系统,committed 可以小于 init。committed 将始终大于或等于 used。

Max:表示可以用于内存管理的最大内存量(以字节为单位)。可以不定义其值。如果定义了该值,最大内存量可能随时间而更改。已使用的内存量和已提 交的内存量将始终小于或等于 max(如果定义了 max)。如果内存分配试图增加满足以下条件的已使用内存将会失败:used > committed,即使 used <= max 仍然为 true(例如,当系统的虚拟内存不足时)。

直接看demo吧!

在实际开发中,一般可以用这个监控线程占用内存使用情况。

import java.lang.management.ManagementFactory;
import java.lang.management.MemoryUsage;

public class MemoryUseTest {

    public String getMemoryUseInfo(){

         MemoryUsage mu = ManagementFactory.getMemoryMXBean().getHeapMemoryUsage();

         long getCommitted = mu.getCommitted();

         long getInit = mu.getInit();

         long getUsed = mu.getUsed();

         long max = mu.getMax();

        return ">>getCommitted(MB)=>" + getCommitted / 1000 / 1000 + "\n"
         +">>getInit(MB)=" + getInit / 1000 / 1000 + "\n"
         +">>getUsed(MB)=" + getUsed / 1000 / 1000 + "\n"
         +">>max(MB)=" + max / 1000 / 1000 + "\n";
      }
   public static void main(String[] args){
           System.out.println(new MemoryUseTest().getMemoryUseInfo());
    }
}

https://blog.csdn.net/dataiyangu/article/details/83539727

JVM中MemoryUsage中init,committed,used,max的含义

posted @ 2019-02-26 10:56  沧海一滴  阅读(1343)  评论(0)    收藏  举报