±à¼ÍƼö: |
±¾ÎÄÀ´×ÔÓÚcsdn,±¾ÎÄÖ÷Òª´ÓjavaµÄÄÚ´æÄ£Ðͽ²Æð£¬×îÖÕ¾Ù³ö¼¸¸öÄÚ´æÐ¹Â¶µÄÀý×Ӻͽâ¾ö·½°¸¡£ |
|
javaÔËÐÐʱÄÚ´æÄ£ÐÍ


¾ßÌåÐÅÏ¢£ºhttp://gityuan.com/2016/01/09/java-memory/
»ØÊÕËã·¨
JVM»ØÊÕËã·¨Ö÷ÒªÓÐÁ½ÖÖ
1.ÒýÓüÆÊý·¨£ºÃ¿¸ö¶ÔÏóÓÐÒ»¸öÒýÓüÆÊýÆ÷£¬µ±¶ÔÏó±»ÒýÓÃÒ»´Îʱ¼ÆÊýÆ÷¼ÓÒ»£¬ÒýÓÃʧЧ¼ÆÊýÆ÷¼õÒ»¡£µ±¼ÆÊýÆ÷Ϊ0ʱ±íʾ¶ÔÏó¿ÉÒÔ±»»ØÊÕ¡£(ÓÉÓÚÎÞ·¨½â¾öÏ໥ÒýÓÃÎÊÌâ¶ø±»·ÏÆú)
2.¿É´ïÐÔËã·¨£º´ÓGC ROOT½Úµã¿ªÊ¼±éÀú£¬¿ÉÒÔÁ¬Í¨µÄ¶ÔÏó¶¼ÊÇ»î¶ÔÏó¡£ÎÞ·¨µ½´ïµÄ¶ÔÏó¿ÉÒÔ±»»ØÊÕ¡£
¿ÉÒÔ×÷ΪGC ROOT½ÚµãµÄ¶ÔÏó
ÐéÄâ»úÕ»µÄÕ»Ö¡µÄ¾Ö²¿±äÁ¿±íÒýÓõĶÔÏó
±¾µØ·½·¨Õ»JNIÒýÓõĶÔÏó
·½·¨ÇøµÄ¾²Ì¬±äÁ¿ºÍ³£Á¿ËùÒýÓõĶÔÏó
Àý×Ó
public
class GCDemo {
public static void main(String[] args) {
GcObject obj1 = new GcObject();
GcObject obj2 = new GcObject();
obj1.instance = obj2;
obj2.instance = obj1;
obj1 = null;
obj2 = null;
}
}
class GcObject {
public Object instance = null;
} |
ÒýÓüÆÊý·¨ÄÚ´æÍ¼

1.step1£ºGcObjectʵÀý1µÄÒýÓüÆÊý+1£¬Ä¿Ç°Îª1
2.step2£ºGcObjectʵÀý2µÄÒýÓüÆÊý+1£¬Ä¿Ç°Îª1
3.step3£ºGcObjectʵÀý2µÄÒýÓüÆÊý+1£¬Ä¿Ç°Îª2
4.step4£ºGcObjectʵÀý1µÄÒýÓüÆÊý+1£¬Ä¿Ç°Îª2
5.obj1 = null£ºGcObjectʵÀý1ÒýÓüÆÊý-1£¬Ä¿Ç°Îª1
6.obj2 = null£ºGcObjectʵÀý2ÒýÓüÆÊý-1£¬Ä¿Ç°Îª1
µ½´ËΪֹ£¬GcObjectʵÀý1ºÍ2¶¼ÎÞ·¨Ê¹Ó㬵«ÊÇÒýÓüÆÊý²»Îª0£¬·¢ÉúÄÚ´æÐ¹Â¶¡£
¿É´ïÐÔËã·¨ÄÚ´æÍ¼

ÓÉ¿ÉÒÔ±»×÷ΪGC ROOT¶ÔÏóÀ´¿´£¬ÐéÄâ»úÕ»ÖÐobj1ºÍobj2ÊÇÁ½¸öGC ROOTÆðµã£¬ÓÉÓÚ×îÖÕ¶¼½«obj1Óëobj2ÉèÖÃΪÁËnull¡£Òò´ËGcObject1ºÍ2¶¼ÎÞ·¨¿É´ï£¬Òò´Ë¿ÉÒÔ±»»ØÊÕ¡£
ÔÚJavaÖУ¬ÄÚ´æÐ¹Â©¾ÍÊÇ´æÔÚһЩ±»·ÖÅäµÄ¶ÔÏó£¬ÕâЩ¶ÔÏóÓÐÏÂÃæÁ½¸öÌØµã£¬Ê×ÏÈ£¬ÕâЩ¶ÔÏóÊǿɴïµÄ£¬¼´ÔÚÓÐÏòͼÖУ¬´æÔÚͨ·¿ÉÒÔÓëÆäÏàÁ¬£»Æä´Î£¬ÕâЩ¶ÔÏóÊÇÎÞÓõ쬼´³ÌÐòÒÔºó²»»áÔÙʹÓÃÕâЩ¶ÔÏó¡£Èç¹û¶ÔÏóÂú×ãÕâÁ½¸öÌõ¼þ£¬ÕâЩ¶ÔÏó¾Í¿ÉÒÔÅж¨ÎªJavaÖеÄÄÚ´æÐ¹Â©£¬ÕâЩ¶ÔÏ󲻻ᱻGCËù»ØÊÕ£¬È»¶øËüÈ´Õ¼ÓÃÄÚ´æ¡£
AndroidÖг£¼ûµÄÄÚ´æÐ¹Â¶
AndroidÖÐ×î³£¼ûµÄÄÚ´æÐ¹Â¶ÊǹØÓÚActivityµÄÄÚ´æÐ¹Â©¡£ÆäºËÐÄÎÊÌâÔÚÓÚÔÚActivityÉúÃüÖÜÆÚÖ®ÍâÈÔÓÐÆäÒýÓᣴÓÄÚ´æÄ£ÐͽǶÈÀ´½²£¬ËüÔÚGC
ROOTINGʱ¿É´ï£¬µ«ÊÇËüµÄonDestroyÒѾ±»Ö´ÐС£¼ÈËü´ÓÎÒÃÇÆÚ´ýµÄÐÐΪÉÏÀ´ËµÓ¦¸Ã±»±êʶΪ¿ÉÒÔ±»»ØÊÕ¡£µ«ËüÈÔÈ»¿É´ï¡£ÒÔϾÍÁгö×î³£¼ûµÄ¼¸ÖÖÇé¿ö£¬Çë¼ÇסºËÐÄì¶Ü£ºActivityÉúÃüÖÜÆÚÖ®ÍâÈÔÓÐÆäÒýÓÃ
Handlerµ¼ÖµÄÄÚ´æÐ¹Â©
public
class SampleActivity extends Activity {
private final Handler mLeakyHandler = new
Handler() {
@Override
public void handleMessage(Message msg) {
// ...
}
}
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
// ÑÓʱ10·ÖÖÓ·¢ËÍÒ»¸öÏûÏ¢
mLeakyHandler.postDelayed(new Runnable() {
@Override
public void run() { }
}, 60 * 10 * 1000);
// ·µ»ØÇ°Ò»¸öActivity
finish();
}
} |
˼¿¼ÉÏÃæ´úÂ룬Ëü»á·¢ÉúÑÏÖØµÄÄÚ´æÐ¹Â¶¡£Ê×ÏÈ£¬mLeakyHandler±»ÉùÃ÷ΪÁËÒ»¸öÄäÃûÄÚ²¿Àà(×Ô¼ºË¼¿¼£¬ÉÏÊö´úÂëÓм¸¸öÄäÃûÄÚ²¿Àà)£¬ËüÒþʽµÄ³ÖÓÐÁËÍⲿÀàActivityµÄÇ¿ÒýÓá£Ö®ºó£¬handler·¢³öÁËÒ»¸ö10·ÖÖÓµÄÑÓʱÏûÏ¢£¬½Ó×ÅActivityɱµôÁË×Ô¼º¡£ÎÊÌâµÄ¹Ø¼üÔÚÓÚhandler·¢³öµÄÏûÏ¢Message»áÔÚÏûÏ¢¶ÓÁÐÀï´æiÔÚ10·ÖÖÓ¡£Ëü³ÖÓз¢³öÏûÏ¢µÄhandlerµÄÒýÓ᣶øhandlerÓÖ³ÖÓÐActivityµÄÇ¿ÒýÓá£Õâ¾Íµ¼ÖÂActivityÔÚÆäÉúÃüÖÜÆÚÖ®ÍâÈÔÓÐÇ¿ÒýÓ㬷¢ÉúÁËÑÏÖØµÄÄÚ´æÐ¹Â¶¡£
×¢Ò⣬ÎÊÌâµÄºËÐÄÔÚÓÚÄÚ²¿ÀàÒÔ¼°ÄäÃûÄÚ²¿Àà¶¼»áÒþʽµÄ³ÖÓÐÍⲿÀàµÄÇ¿ÒýÓá£Õâ¾Íµ¼ÖÂÒ»¸öÀàµÄÉúÃü²»ÔÚÓÉÒ»¸öÒòËØ¿ØÖÆ£¬±äΪÁ˶à¸öÒòËØ¡£ÔÚÎÒÃÇÈÏΪ¸Ã½áÊøµÄʱºò¶øÃ»ÓвúÉúÕýÈ·µÄÐÐΪ¡£½â¾öµÄ·½°¸ºÜ¼òµ¥£¬Ò²ºÜͨÓãº
Óþ²Ì¬ÄÚ²¿Àà¡£
ÔÚ¾²Ì¬ÄÚ²¿Àà¸ù¾ÝÐèÇóʹÓÃÈõÒýÓÃÐÞÊÎÐèÒªÒýÓõÄÍⲿÀà×ÊÔ´¡£
public
class SampleActivity extends Activity {
/**
* ÄäÃûÀàµÄ¾²Ì¬ÊµÀý²»»áÒþʽ³ÖÓÐËûÃÇÍⲿÀàµÄÒýÓÃ
*/
private static final Runnable sRunnable = new
Runnable() {
@Override
public void run() {
}
};
private final MyHandler mHandler = new MyHandler(this);
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
// ÑÓʱ10·ÖÖÓ·¢ËÍÒ»¸öÏûÏ¢.
mHandler.postDelayed(sRunnable, 60 * 10 * 1000);
// ·µ»ØÇ°Ò»¸öActivity
finish();
}
/**
* ¾²Ì¬ÄÚ²¿ÀàµÄʵÀý²»»áÒþʽ³ÖÓÐËûÃÇÍⲿÀàµÄÒýÓá£
*/
private static class MyHandler extends Handler
{
private final WeakReference<SampleActivity>
mActivity;
public MyHandler(SampleActivity activity)
{
mActivity = new WeakReference<SampleActivity>(activity);
}
@Override
public void handleMessage(Message msg) {
SampleActivity activity = mActivity.get();
if (activity != null) {
// ...
}
}
}
} |
static±äÁ¿µ¼ÖµÄÄÚ´æÐ¹Â©
static±äÁ¿ÔÚ½ø³ÌÆô¶¯µÄʱºò±»·ÖÅäÄÚ´æ¿Õ¼ä¡£ÔÚ½ø³Ì±»É±ËÀµÄʱºòÊÍ·ÅÄÚ´æ¿Õ¼ä¡£Òò´Ë£¬ËüµÄÉúÃüÖÜÆÚÊǹᴩÕû¸öÓ¦ÓõÄÉúÃüÖÜÆÚµÄ¡£Ò²¾ÍÊÇ˵£¬µ±ÄãµÄActivity±»¾²Ì¬±äÁ¿È¾Ö¸µ½¡£ÄÇôÓֻᵼÖÂActivityÔÚÆäÉúÃüÖÜÆÚÖ®ÍâÈÔÓÐÇ¿ÒýÓ㬷¢ÉúÄÚ´æÐ¹Â¶¡£
³£¼ûµÄ³¡¾°ÈçÏ£º
static
Context
static View |
Á½Õߵı¾ÖÊÊÇÒ»ÑùµÄ£¬ÒòΪViewÄÚ²¿³ÖÓÐContextµÄÒýÓᣵÚÒ»ÖÖ×î³£¼ûµÄ¾ÍÊǵ¥ÀýģʽµÄʵÏÖ£¬½«¾ßÌåµÄActivityµÄContext´«µÝ½øÈ¥¹¹Ôìµ¥Àý¶ÔÏ󣬵¼ÖÂй¶¡£µÚ¶þÖÖÊǵ±ViewÐèÒª¼ÓÔØµÄ×ÊÔ´±È½Ï´óʱ£¬ÏëÒ»ÀÍÓÀÒÝ¡£¶ø²úÉúÄÚ´æÐ¹Â¶¡£
½â¾ö·½·¨ÒÀȻͨÓÃÇÒ¼òµ¥£¬ÔÚActivityÉùÃ÷ÖÜÆÚÍâʹÓÃContext¾¡Á¿È¥Ê¹ÓÃApplicationµÄContext
ActiviityÄÚ²¿ÉùÃ÷µÄ¾²Ì¬×ÊÔ´Òª¼°Ê±ÊÍ·Å£¬ ÔÚÏàÓ¦µÄÉùÃ÷ÖÜÆÚ·½·¨ÖÐ×öºÃÊÕβ¹¤×÷
×¢²áÓë½â×¢²á
ÔÚandorid¿ª·¢ÖУ¬ÎÒÃǾ³£»áÔÚActivityµÄonCreateÖÐ×¢²á¹ã²¥½ÓÊÜÆ÷¡¢EventBusµÈ£¬Èç¹ûÍü¼Ç³É¶ÔµÄʹÓ÷´×¢²á£¬¿ÉÄÜ»áÒýÆðÄÚ´æÐ¹Â©¡£¿ª·¢¹ý³ÌÖÐÓ¦¸ÃÑø³ÉÁ¼ºÃµÄÏà¹Ø£¬ÔÚonCreate»òonResumeÖÐ×¢²á£¬Òª¼ÇµÃÏàÓ¦µÄÔÚonDestroy»òonPauseÖз´×¢²á¡£
´´½¨Óë¹Ø±Õ
ÔÚandroidÖУ¬×ÊÔ´ÐÔ¶ÔÏó±ÈÈçCursor¡¢File¡¢Bitmap¡¢ÊÓÆµµÈ£¬ÏµÍ³¶¼ÓÃÁËһЩ»º³å¼¼Êõ£¬ÔÚʹÓÃÕâЩ×ÊÔ´µÄʱºò£¬Èç¹ûÎÒÃÇÈ·±£×Ô¼º²»ÔÙʹÓÃÕâЩ×ÊÔ´ÁË£¬Òª¼°Ê±¹Ø±Õ£¬·ñÔò¿ÉÄÜÒýÆðÄÚ´æÐ¹Â©¡£ÒòΪÓÐЩ²Ù×÷²»½ö½öÖ»ÊÇÉæ¼°µ½DalvikÐéÄâ»ú£¬»¹Éæ¼°µ½µ×²ãC/C++µÈµÄÄÚ´æ¹ÜÀí£¬²»ÄÜÍêÈ«¼ÄÏ£ÍûÐéÄâ»ú°ïÎÒÃÇÍê³ÉÄÚ´æ¹ÜÀí¡£
ÔÚÕâЩ×ÊÔ´²»Ê¹ÓõÄʱºò£¬¼ÇµÃµ÷ÓÃÏàÓ¦µÄÀàËÆclose£¨£©¡¢destroy£¨£©¡¢recycler£¨£©¡¢release£¨£©µÈº¯Êý£¬ÕâЩº¯ÊýÍùÍù»áͨ¹ýjniµ÷ÓõײãC/C++µÄÏàÓ¦º¯Êý£¬Íê³ÉÏà¹ØµÄÄÚ´æÊÍ·Å¡£
Cursor¶ÔÏó¼°Ê±¹Ø±Õ
IO¶ÔÏó¼°Ê±¹Ø±Õ
¼¯ºÏÔì³ÉµÄÄÚ´æÐ¹Â©
Vector
v = new Vector(10);
for (int i = 1; i < 100; i++) {
Object o = new Object();
v.add(o);
o = null;
} |
»¸ö¼òµ¥µÄÄÚ´æÍ¼¾Í¿ÉÒÔ¿´³öÔÚÕ»ÖзÖÅäµÄvÖ¸ÏòÁËÔÚ¶ÑÖзÖÅäµÄÊ®¸ö¿Õ¼ä£¬ËäȻÿ´ÎÖÃΪnull£¬µ«Êǽ«V×÷ΪGC
ROOTµÄÆðµãÈÔÈ»¿É´ïÿһ¸öÔÚ¶ÑÖеÄObject¶ÔÏ󣬶øÎÒÃDZ¾ÒâÊǽ«Ã¿Ò»¸öObject¶ÔÏóÖÃΪÁËnull¡£
½â¾ö·½°¸ºÜ¼òµ¥£ºv = null ¡£±¾ÖÊÉÏÊǶϵôGC ROOTµÄÆðµã¡£ |