【JVM】查看JVM加载的类及类加载器的方法
查看JVM加载了哪些类
java -verbose[:class|gc|jni] 在输出设备上显示虚拟机运行信息。
java -verbose:class
在程序运行的时候有多少类被加载!你可以用verbose:class来监视,在命令行输入java -verbose:class XXX  (XXX为程序名),也可以直接在JVM启动时添加启动参数-verbose:class,你会在控制台(或者指定的启动日志文件,如catalina.out中)看到加载的类的情况。
verbose和 verbose:class 含义相同,输出虚拟机装入的类的信息,显示的信息格式如下:
[Opened D:\Java\jdk1.6.0_25\jre\lib\rt.jar]
[Loaded java.lang.Object from D:\Java\jdk1.6.0_25\jre\lib\rt.jar]
[Loaded java.io.Serializable from D:\Java\jdk1.6.0_25\jre\lib\rt.jar]
[Loaded java.lang.Comparable from D:\Java\jdk1.6.0_25\jre\lib\rt.jar]
[Loaded java.lang.CharSequence from D:\Java\jdk1.6.0_25\jre\lib\rt.jar]
[Loaded java.lang.String from D:\Java\jdk1.6.0_25\jre\lib\rt.jar]
[Loaded java.lang.reflect.GenericDeclaration from D:\Java\jdk1.6.0_25\jre\lib\rt.jar]
[Loaded java.lang.reflect.Type from D:\Java\jdk1.6.0_25\jre\lib\rt.jar]
[Loaded java.lang.reflect.AnnotatedElement from D:\Java\jdk1.6.0_25\jre\lib\rt.jar]
[Loaded java.lang.Class from D:\Java\jdk1.6.0_25\jre\lib\rt.jar]
[Loaded java.lang.Cloneable from D:\Java\jdk1.6.0_25\jre\lib\rt.jar]
[Loaded java.lang.ClassLoader from D:\Java\jdk1.6.0_25\jre\lib\rt.jar]
[Loaded java.lang.System from D:\Java\jdk1.6.0_25\jre\lib\rt.jar]
[Loaded java.lang.Throwable from D:\Java\jdk1.6.0_25\jre\lib\rt.jar]
当虚拟机报告类找不到或类冲突时可用此参数来诊断来查看虚拟机从装入类的情况。
说明:
1、可以通过tailf catalina.out > temp.txt命令,将启动时的加载日志重定向到特定文件中,方便后续分析。
2、网上有说可以通过jinfo pid方式查看加载的jar包(在java.class.path下),实操发现,列出的结果不完整
java –verbose:gc
在虚拟机发生内存回收时在输出设备显示信息,格式如下: [Full GC 256K->160K(124096K), 0.0042708 secs] 该参数用来监视虚拟机内存回收的情况。
public class JvmVerbose
{
    /**
    * JVM -verbose[:class|gc|jni] 参数测试
    * @param args
    */
    public static void main(String[] args)
    {
        JvmVerbose jvmVerbose = new JvmVerbose();
        System.gc();
    }
}
在这个例子中,一个新的对象被创建,由于它没有使用,所以该对象迅速地变为可达,程序编译后,执行命令: java -verbose:gc JvmVerbose 后结果为:
[GC 647K->256K(124096K), 0.0274253 secs]
[Full GC 256K->160K(124096K), 0.0042708 secs]
箭头前后的数据256K和160K分别表示垃圾收集GC前后所有存活对象使用的内存容量,说明有256K-160K=96K的对象容量被回收,括号内的数据124096K为堆内存的总容量,收集所需要的时间是0.0042708秒(这个时间在每次执行的时候会有所不同)。
java -verbose:jni
使用-verbose:jni输出native方法调用的相关情况,一般用于诊断jni调用错误信息。
在虚拟机调用native方法时输出设备显示信息,格式如下: [Dynamic-linking native method java.lang.Object.registerNatives ... JNI] 该参数用来监视虚拟机调用本地方法的情况,在发生jni错误时可为诊断提供便利。
查看内存中的类的加载信息
不同类加载器加载同一个类也处于不同的命名空间中,在内存中被视为不同的类。因此在处理类冲突时需要确认同名类是否被相同的类加载器加载,这个时候可以使用以下方式。
通过打印出类的内存快照,并加以分析,可以查看类的类加载器信息。
1、先通过ps -ef|grep proc找出进程号
2、使用dump内存信息到heap.bin文件
使用命令jmap -dump:live,format=b,file=heap.bin pid(进程号)将进程pid的堆栈信息输出到heap.bin文件中
zqq@linux:~/logs> jmap -dump:live,format=b,file=heap.bin 16597
Dumping heap to /home/logs/heap.bin ...
Heap dump file created
3、使用jhat 对heap.bin 文件进行分析
命令jhat -J-mx512m heap.bin, 如果解析过程中出现内存不足,需要加大内存如:jhat -J-mx800m heap.bin
zqq@linux:~/logs> jhat -J-mx512m heap.bin
Reading from heap.bin...
Dump file created Mon Jun 11 15:34:53 CST 2018
Snapshot read, resolving...
Resolving 448749 objects...
Chasing references, expect 89 dots.........................................................................................
Eliminating duplicate references.........................................................................................
Snapshot resolved.
Started HTTP server on port 7000
Server is ready.
通过浏览器访问 http://ip:7000/ 即可看到分析结果。点击每个类,可以查看详细信息,包括该类是被哪个类加载器加载。
Package com.adventnet.agent.utilities.xml
class com.adventnet.agent.utilities.xml.XMLDataReader [0x602155cf0]
class com.adventnet.agent.utilities.xml.XMLDataWriter [0x602138950]
class com.adventnet.agent.utilities.xml.XMLIndenter [0x60211c800]
class com.adventnet.agent.utilities.xml.XMLNode [0x602155c70]
Package com.ctc.wstx.api
class com.ctc.wstx.api.CommonConfig [0x6005e7d00]
class com.ctc.wstx.api.ReaderConfig [0x6005e7df0]
class com.ctc.wstx.api.WstxInputProperties [0x6005e9bf0]
class com.ctc.wstx.api.WstxInputProperties$ParsingMode [0x6005ea570]
【JVM】查看JVM加载的类及类加载器的方法的更多相关文章
- java 反射,类的加载过程以及Classloader类加载器
		
首先自定义一个类Person package reflection; public class Person { private String name; public int age; public ...
 - java编译报错: 找不到或无法加载主类 Demo.class 的解决方法
		
原因:java 命令后面的文件不能有后缀名. 解决方法:运行java时候,后面的文件去掉后缀名.
 - JVM总结-虚拟机加载类
		
从 class 文件到内存中的类,按先后顺序需要经过加载.链接以及初始化三大步骤.其中,链接过程中同样需要验证:而内存中的类没有经过初始化,同样不能使用.那么,是否所有的 Java 类都需要经过这几步 ...
 - 虚拟机(JVM)如何加载类
		
首先JVM加载类的一般流程分三步: 加载 链接 初始化 那么是否全部Java类都是这样三步走的方式加载呢?我们可以从Java的数据类型去出发.Java分基本类型和引用类型.其中按照面向对象的特性,一切 ...
 - spring boot找不到或无法加载主类 io.renren.RenrenApplication
		
spring boot找不到或无法加载主类 io.renren.RenrenApplication 出现问题: spring boot 项目以前一直是好好的,用mvn clean package 打包 ...
 - 面试BAT必问的JVM,今天我们来说一说它类加载器的底层原理
		
类加载器的关系 类加载器的分类 JVM支持两种类加载器,一种为引导类加载器(Bootstrap ClassLoader),另外一种是自定义类加载器(User Defined ClassLoader) ...
 - 骚操作:不重启 JVM,如何替换掉已经加载的类?
		
Java对象行为 java.lang.instrument.Instrumentation 直接操作字节码 BTrace Arthas 三生万物 在遥远的希艾斯星球爪哇国塞沃城中,两名年轻的程序员正在 ...
 - 【基本功】Java动态追踪技术探究  不重启JVM,替换掉已经加载的类?不重启JVM,获知运行时对象的属性
		
https://mp.weixin.qq.com/s/_hSaI5yMvPTWxvFgl-UItA 小结: 1.根据Java的类加载机制,在同一个ClassLoader中,类是不允许重复的: 2.单例 ...
 - JVM如何加载一个类的过程,双亲委派模型中有哪些方法
		
1.类加载过程:加载.验证.准备.解析.初始化 加载 在加载阶段,虚拟机主要完成三件事: 1.通过一个类的全限定名来获取定义此类的二进制字节流. 2.将这个字节流所代表的静态存储结构转化为方法 ...
 
随机推荐
- Python之缩进块
			
pycharm编辑器识别冒号,当换行后下一行默认是缩进块的位置:
 - Rime 小狼毫 注意事项
			
https://rime.im/https://github.com/rime/weasel/pulse 打不出中文可能是,没有五笔需要的文件: wubi_pinyin.schema.yamlCtrl ...
 - jmeter5.0生成html报告 快速入门
			
JMeter性能测试5.0时代之-多维度的图形化HTML报告 快速入门 1.确认基本配置 在jmeter.properties或者user.properties确认如下配置项: jmeter.save ...
 - text-decoration、text-decoration-color、text-decoration-line、text-decoration-style属性
			
text-decoration:over-line 定义上划线 text-decoration:line-through 定义删除线 text-decoration:underline 定义下划 ...
 - Linux下面将windows写的脚本转换成 Linux 格式的文件
			
1.接着上一篇blog 发现有一个问题 vim 打开文件 发现最下面有一行信息: 2. 里面有一些 不一样的地方. linux里面没法执行 ,如果想执行的话 可以输入命令 :set fileforma ...
 - Springboot自定义过滤器Filter
			
前言:自己写了个Springboot项目,最近写的功能越来越多,结合业务已经要写过滤器Filter来过滤处理一些请求. 在网上看了几篇博客,总结如下: 过滤器配置方式有两种: 1.通过@WebFilt ...
 - .Net在操作mysql查询的时候出现“: Unknown column 'UserName' in 'where clause'”错误
			
今天使用.Net操作mysql查询的时候,如果加上条件查询的时候就会出现 Unknown column 'UserName' in 'where clause'这个错,不加条件直接select * f ...
 - kubernetes常用命令
			
#.查询信息 kubectl get [需要查询的服务] node 节点componentstatuses 简写 cs 组件状态namespaces 简写 ns 名命空间pod pod信息 添加 ...
 - Java语言支持的3种变量类型
			
类变量(静态变量):独立于方法之外的变量,用 static 修饰. 实例变量(全局变量):独立于方法之外的变量,不过没有 static 修饰. 局部变量:类的方法中的变量. 例子如下: public ...
 - crontab 从nano 转换为 vim
			
crontab默认编辑器为nano,不方便使用. 修改crontab默认编辑器为vi或者其他的编辑器. export EDITOR="/usr/bin/vim" ; cront ...