当旋转两次屏幕
此时的JAVA Heap如下图:

在MyView类中找到了原因是在onDraw方法中创建了这两个对象
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
RectF rect = new RectF(0, 0, 100, 100);
Paint paint = new Paint();
paint.setColor(Color.RED);
paint.setStrokeWidth(4);
canvas.drawArc(rect, 0, 180, true, paint);
}

说明静态变量的创建没有问题
点击了”StartAllocation“
通过观察MemoryMonitor发现内存抖动现象,如下图

再进一步通过AllocationTracker定位到了发生此现象的原因
点击事件触发了startAllocationLargeNumbersOfObjects()方法而在该方法中进行了一个for循环不断的创建Rect对象

代码如下:
for (int i = 0; i < 10000; i++) {
Rect rect = new Rect(0, 0, 100, 100);
System.out.println("-------: " + rect.width());
}
代码修改为:
Rect rect = new Rect(0, 0, 100, 100);
StringBuilder stringBuilder= new StringBuilder("-------: ");
stringBuilder.append(rect.width());
for (int i = 0; i < 10000; i++) {
System.out.println(stringBuilder);
}

点击”StartActivityB“按钮
旋转屏幕在通知栏显示存在内存泄漏

可以看出静态变量sTextView、mHandler持有MainActivity的引用造成了内存泄漏

网友评论