java - 从线程中更改 boolean 变量时,java中的long gc收集

标签 java android multithreading garbage-collection

我遇到了一个奇怪的问题,花了我很长时间才找出原因, 我有一个类启动一个简单的线程:

public class ServerConnector implements Handler {

private ConcurrentLinkedQueue<ImagePackage> queue;
private  boolean isDuringSend;
private String requestId;
private boolean isRunning;
private boolean done;
private ImagePackage packet;
private Context context;

public ServerConnector(Context context) {
    packet = null;
    this.context = context;
    done = false;
    requestId = null;
    isDuringSend = false;
    queue = new ConcurrentLinkedQueue<ImagePackage>();
}

public void add(ImagePackage packet) {
    if (packet.getImage() != null) {
        synchronized (queue) {
            queue.add(packet);
            queue.notifyAll();
        }

    }

}

public void start() {
    isRunning = true;

    Thread t = new Thread(new Runnable() {
        ImagePackage packet = null;

        @Override
        public void run() {

            while (isRunning) {
                if (!isDuringSend) {

                    packet = getElementFromQueue();
                    if (packet == null) {

                        continue;
                    }

                    try {


                        isDuringSend = true;
                    //  processQueue(packet);
                    } catch (Exception e) {

                        Intent intent = new Intent(context,
                                LoadingActivity.class);
                        context.startActivity(intent);
                        isDuringSend = false;

                    }
                }
            }
        }
    });
    t.start();

}

现在 GC 开始工作了,他花了 300 毫秒来清理所有内容:

  12-29 23:41:06.937: D/dalvikvm(14102): GC_FOR_ALLOC freed 0K, 16% free 13788K/16244K, paused                    271ms, total 271ms
  12-29 23:41:07.257: D/dalvikvm(14102): JIT unchain all for threadid=16
  12-29 23:41:07.287: D/dalvikvm(14102): GC_FOR_ALLOC freed 69K, 6% free 15289K/16244K, paused 270ms, total 272ms
  12-29 23:41:07.567: D/dalvikvm(14102): JIT unchain all for threadid=16 
  12-29 23:41:07.848: D/dalvikvm(14102): JIT unchain all for threadid=16
  12  -29 23:41:07.868: D/dalvikvm(14102): GC_EXPLICIT freed 3036K, 21% free 13858K/17460K,   paused   254ms+256ms, total 545ms

但是当我从代码中删除这个简单的行“is during send = false”(基本上只是从线程内部将 boolean 字段切换为 true)时,GC 清理时间将减少到约 40 毫秒。

请问为什么会发生这种情况,有什么想法吗?

public void start() {
    isRunning = true;

    Thread t = new Thread(new Runnable() {
        ImagePackage packet = null;

        @Override
        public void run() {

            while (isRunning) {
                if (!isDuringSend) {

                    packet = getElementFromQueue();
                    if (packet == null) {

                        continue;
                    }

                    try {


                        isDuringSend = true;
                    //  processQueue(packet);
                    } catch (Exception e) {

最佳答案

我遇到了类似的问题,GC 导致我的应用程序出现滞后,通过向可以从另一个线程更改的变量添加“ volatile ”来解决,在您的情况下,它将是“isDuringSend”变量。

就我而言,我不知道是什么原因造成的,所以您的问题确实帮助我找到了问题。

关于java - 从线程中更改 boolean 变量时,java中的long gc收集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20830481/

相关文章:

java - 在防火墙后面添加 Sherlock os Maven 依赖项,并且不引用项目

c# - EF6 ToListAsync() 取消长查询不起作用

java - Android 问题基于套接字动态更新 ListView

java - 基于标准的字符串验证

java - 使用 BigInteger 检查回文

android - 在 Xamarin Android 中打开文件

java - 编译 Android App 时出现错误

java - 多个 FireBase 监听器调用,有异常吗?

java - 如何在 Debian 10 (Buster) 上安装 openjdk-8-jdk?

java - 如何使用 Java 和 Jsoup 读取网站的特定行?