分析内存常用工具
top/procrank
meinfo
Procstats
DDMS
MAT
Finder-Activity
LeakCanary
LeakInspector
工具很多,掌握原理方法,工具随便找两个能用就行
1、Java 虚拟机 简单讲解一下
image.pngimage.png
线程私有
程序计数器(PC)
相当于一个执行代码的指示器,用来确认下一行执行的代码的地址,每个线程都有一个,没有OOM的区
虚拟机栈
存储着 局部变量,方法的返回地址
OOM stackoverflow 异常会在虚拟机栈中报错
重要特点没有内存碎片*
本地方法栈
存放native方法
在 hotspotVM 把虚拟机栈和本地方法栈合并为一个栈
共享数据区
方法区
- ClassLoader加载类信息
常量,静态变量
编译后的代码 - OOM
- 运行时常量沲
字面量public satic final java常量,
符号引用 类, 接口全名, 方法名
java 堆栈 - 虚拟机能管理的最大的一块内存 GC的主战场
- OOM
- 对象实例 数组的内容
2、GC垃圾回收器(GC如何 确定内存回收)
应用计数法
ex:
Object o1=new Object(); 计数+1=1(内存引用的内存)
Object o2;
o2=o1; 计数+1=2
o1=null; 计数为1 o1和o2都不会回收
计数器不归零,引用块不会被回收
可达性分析算法
例如上图 当ObjA =null后,ObjB、Objc对ObjA 的引用链断开,Gc就会视除了GcRoot 以外的的为垃圾,必要的时候就会回收,GC 会扫描两次。
引用类型
(引用分 强引用 软引用 弱引用 虚引用)
虚引用(PhantomReference):功能-不会影响到对象的生命周期,但是能让程序员知道对象什么时候被回收了
弱引用(WeakReference):第一次扫到了,就标记下来,第二次扫到直接回收
软引用(SoftReference)内存不足时回收,存放一些重要性不是很强又不能随便让清除的对象,比如图片切换到后台不需要马上显示了
强引用Object obj=new Object();
网友评论