Trong một cuộc săn tìm rò rỉ bộ nhớ trong ứng dụng của tôi, tôi đã truy tìm một hành vi mà tôi không thể hiểu được. Tôi phân bổ một khối bộ nhớ lớn, nhưng nó không nhận được rác thu được kết quả trong một OOM, trừ khi tôi rõ ràng null tham chiếu trong onDestroy.Bộ nhớ lớn không phải rác thải được thu thập
Trong ví dụ này, tôi có hai hoạt động gần như giống hệt nhau chuyển đổi giữa nhau. Cả hai đều có một nút duy nhất. Khi nhấn nút MainActivity sẽ khởi động OOMActivity và OOMActivity trả về bằng cách gọi kết thúc(). Sau khi nhấn các nút một vài lần, Android sẽ ném ra một nhận thức.
Nếu tôi thêm onDestroy vào OOMActivity và rõ ràng null tham chiếu đến phần bộ nhớ, tôi có thể thấy trong nhật ký rằng bộ nhớ được giải phóng một cách chính xác.
Tại sao bộ nhớ không được tự động giải phóng mà không có giá trị rỗng?
MainActivity:
package com.example.oom;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MainActivity extends Activity implements OnClickListener {
private int buttonId;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
System.gc();
Button OOMButton = new Button(this);
OOMButton.setText("OOM");
buttonId = OOMButton.getId();
setContentView(OOMButton);
OOMButton.setOnClickListener(this);
}
@Override
public void onClick(View v) {
if (v.getId() == buttonId) {
Intent leakIntent = new Intent(this, OOMActivity.class);
startActivity(leakIntent);
}
}
}
OOMActivity:
public class OOMActivity extends Activity implements OnClickListener {
private static final int WASTE_SIZE = 20000000;
private byte[] waste;
private int buttonId;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Button BackButton = new Button(this);
BackButton.setText("Back");
buttonId = BackButton.getId();
setContentView(BackButton);
BackButton.setOnClickListener(this);
waste = new byte[WASTE_SIZE];
}
public void onClick(View view) {
if (view.getId() == buttonId) {
finish();
}
}
}
ví dụ tuyệt vời, câu hỏi hay! – WarrenFaith
Vui lòng đọc cuộc trò chuyện này. Chúng tôi đã [thảo luận ở đây] (http://chat.stackoverflow.com/transcript/message/10084186#10084186) – Reno
Có thể bạn đang thử nghiệm điều này trên thiết bị trước tổ ong. Bộ thu gom rác trên hậu tổ ong sẽ đủ mạnh để giải phóng đối tượng "rác". Thử nghiệm trên 4.1.2, 4.2.2, 2.3.5, 2.3.7. Gọi System.gc() trước khi "waste = new byte [WASTE_SIZE]" tránh sự cố trên thiết bị trước tổ ong. – pellucide