我遇到了一个奇怪的问题,花了我很长时间才找出原因, 我有一个类启动一个简单的线程:
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/