内存优化(一)

分析内存常用工具

top/procrank
meinfo
Procstats
DDMS
MAT
Finder-Activity
LeakCanary
LeakInspector
工具很多,掌握原理方法,工具随便找两个能用就行

1、Java 虚拟机 简单讲解一下
image.png

image.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();

你可能感兴趣的:(内存优化(一))