jvm-基础
在虚拟机上看: 用top定位哪个进程对cpu的占用过高 ps H -eo pid,tid,%cpu | grep 进程id (用ps命令进一步定位是哪个线程引起的cpu占用过高) jstack 进程id 可以根据线程id 找到有问题的线程,进一步定位到问题代码的源码行号
通过new 对象
第二种: 直接输入 jconsole
第三种: jvisualvm
是所有java虚拟机共享的区,存储类相关结构。成员方法,构造器。 在虚拟机启动是被创建,逻辑上是堆的组成部分
5.2 组成
方法区内存溢出
进行反编译: javap -v 类名
在串池中有 [" a" , "b " ]
堆中有
底层是haseTable可以通过GC进行回收
调优
计算毫秒
它不属于JVM中, 是操作系统内存。不受JVM内存回收机制。它分配过大也会导致内存溢出
但是 gc在使用的过程中可以将直接内存释放, Unsafe类,通过反射手动进行释放
有时在项目中
增加, 将显示的垃圾回收关闭,防止影响性能, system.gc() 就是显示的回收
1、如何判断对象可以回收
(1) 引用计数法 :引用时+1,不在引用-1 ,当为0时 可以作为垃圾 回收,解决不了循环引用的问题。
(2) 可达性分析算法:先确定跟对象(肯定不会被回收的),如果一个对象没有被跟对象直接或间接的引用 那么它就会被当做垃圾被回收
(3)四种引用:
强引用 、 软引用 、 弱引用 、 虚引用 、 终结器引用
当软弱引用的对象 都被回收时, 会被放到引用队列中 减小内存的分配。
虚引用 、终结器引用都必须配合 引用队列使用
软引用实例
弱引用实例