markzhai / AndroidPerformanceMonitor

A transparent ui-block detection library for Android. (known as BlockCanary)
Apache License 2.0
6.66k stars 1.02k forks source link

memory thrashing #81

Closed passionli closed 7 years ago

passionli commented 7 years ago

Setup BlockCanary, and from the AS memory monitor I see that memory was allocated and fire GC. The problem is that in the Loop.loop() printer append string to print log.

So, I have no idea whether this will cause performance issue.

2dxgujun commented 7 years ago

我也遇到了,实验了一下应该是Handler的toString和Object的toString方法导致的,可以复写这两个toString方法来避免这个问题

passionli commented 7 years ago

@2dxgujun 用Allocation和Method Tracking工具可以定位到确实是Handler.toString和Object.toString引起,这些消息都是显示帧的消息。如下:

>>>>> Dispatching to Handler (android.view.Choreographer$FrameHandler) {41ad4230} android.view.Choreographer$FrameDisplayEventReceiver@41ad4258: 0
<<<<< Finished to Handler (android.view.Choreographer$FrameHandler) {41ad4230} android.view.Choreographer$FrameDisplayEventReceiver@41ad4258

这两个对象是底层创建的,你说的override他们的toString方法是通过反射? Choreographer中Handler是final修饰着的,想了下动态代理也不行

    private final FrameHandler mHandler;

请问下,你说的是指override他们吗?还是自己的Handler?

2dxgujun commented 7 years ago

@passionli 我是自己的Handler,自己的Thread,自己的事件

markzhai commented 7 years ago

好像跟我没什么关系?。。。 @passionli

passionli commented 7 years ago

这个跟BlockCanary无关,是Looper内部组装log数据导致的。