类加载器的种类
启动类加载器(Bootstrap ClassLoader) 负责加载JRE的核心类库,如JRE目标下的rt.jar,charsets.jar等
扩展类加载器(Extension ClassLoader) 负责加载JRE扩展目录ext中jar类包
系统类加载器(Application ClassLoader) 负责加载ClassPath路径下的类包
用户自定义加载器(User ClassLoader) 负责加载用户自定义路径下的类包
类加载机制
全盘负责委托机制
当一个ClassLoader加载一个类的时候,除非显示的使用另一个ClassLoader,该类所依赖和引用的类也由这个 ClassLoader载入 双亲委派机制
指先委托父类加载器寻找目标类,在找不到的情况下载自己的路径中查找并载入目标类
双亲委派模式的优势
沙箱安全机制:比如自己写的String.class类不会被加载,这样可以防止核心库被随意篡改 避免类的重复加载:当父ClassLoader已经加载了该类的时候,就不需要子CJlassLoader再加载一次
JDBC连接打破了双亲委派机制。。。
当不让用可视化工具就要使用这些命令了,,,,,
常见jvm命令
jps:查看运行的java进程
jps -vl;详细信息
Jstat
jstat命令可以查看堆内存各部分的使用量,以及加载类的数量。命令格式:
jstat -class 进程 :类加载统计
jstat -gc 进程:垃圾回收统计
s:survivor区 c:代表总空间大小 u:usered e:Eden伊甸园 o:order 老年代
MC:元空间的总空间 MU:元空间的使用空间 CCSC:压缩类的总空间 CCSU:压缩类的使用空间 YGC:年轻代垃圾回收次数 YGCT:年轻代垃圾回收消耗时间 FGC:老年代垃圾回收次数 FGCT:老年代垃圾回收消耗时间 GCT:垃圾回收消耗总时间
jstat -capacity 进程:堆内存统计
Jmap
可以用来查看内存信息
jmap -histo 7824 > xxx.txt :堆的对象统计(包括回收的和活的) jmap -histo:live 7824 > xxx.txt
Num:序号 Instances:实例数量 Bytes:占用空间大小 Class Name:类名 堆信息
堆内存dump ,查看hprof文件
可以使用jvisualvm命令工具导入文件分析(jdk自带工具)
当内存溢出时查看hprof文件,通过JVisualVM查看类,类的数量---------->用这个软件实时查看堆信息------>OOM
Jstack
jstack用于生成java虚拟机当前时刻的线程快照
jstack 15215 > deadLock.txt
prio:进程优先级 os_prio:操作系统优先级 tid:jvm中内存地址 nid:cpu中的线程
用于查看栈信息-------------->线程快照------------->死锁,死循环