[英]Will it happen - object created and immediately garbage collected in java
[英]Android/Java object not garbage collected
我正在開發一個簡單的pdf閱讀器來重寫現有的例子。 我的應用程序有一個自定義視圖,下一個和上一個按鈕。 單擊下一個按鈕時,它會從Internet下載pdf並在視圖中顯示。 每次單擊下一個或上一個按鈕時,都會調用以下showPdf()方法。
public void showPdf(){
RelativeLayout lout = (RelativeLayout)LayoutInflater.from(this).inflate(R.layout.main, null);
setContentView( lout );
m_vPDF = null;
m_vPDF = (PDFReader)lout.findViewById(R.id.PDFView);
m_vPDF.open( m_doc);
m_vPDF.setViewListener(m_vPDF);
LinearLayout bar_find = (LinearLayout)lout.findViewById(R.id.bar_find);
//
btn_prev = (Button)bar_find.findViewById(R.id.btn_prev);
btn_next = (Button)bar_find.findViewById(R.id.btn_next);
//
btn_prev.setOnClickListener(this);
btn_next.setOnClickListener(this);
}
PDFReader是具有顯示PDF的查看器的對象。 以下是PDFReader代碼的一部分。
public class PDFReader extends View implements PDFView.PDFViewListener,
ThumbView.ThumbListener
{
private PDFView m_viewer = null;
public PDFReader(Context context)
{
super(context);
}
public PDFReader(Context context, AttributeSet attrs)
{
super(context, attrs);
}
public void set_viewer( int view_style )
{
switch( view_style )
{
case 1:
m_viewer = new PDFViewHorz();
break;
case 2:
m_viewer = new PDFViewScroll();
break;
case 3:
m_viewer = new PDFViewSingle();
break;
case 4:
m_viewer = new PDFViewSingleEx();
break;
case 5:
m_viewer = new PDFViewReflow();
break;
default:
m_viewer = new PDFViewVert();
break;
}
if( m_viewer != null )
{
if( doc != null ) m_viewer.viewOpen(getContext(), doc, 0xFFCC0000, 4);
m_viewer.viewSetAnnotListener( annot_listener );
m_viewer.viewSetViewListener( view_listener );
m_viewer.viewResize(getWidth(), getHeight());
if( pos != null ) m_viewer.viewGoto(pos);
}
}
在我的showPdf中,每次單擊按鈕時都會初始化PDFReader,而在PDFReader中,PDFView的實例會使用PDFViewVert對象進行初始化,即使將PDFReader設置為null並將PDFView設置為null,也不會進行垃圾回收。 結果它導致了內存錯誤。
這是轉儲的內存分析,顯示已創建了14個PDFViewVert實例,但從未取消分配。
14 instances of "com.radaee.pdfex.PDFViewVert$1", loaded by "dalvik.system.PathClassLoader @ 0x412a0b08" occupy 19,602,792 (64.39%) bytes.
Biggest instances:
com.radaee.pdfex.PDFViewVert$1 @ 0x412a1ae8 - 1,543,040 (5.07%) bytes.
com.radaee.pdfex.PDFViewVert$1 @ 0x412c7c30 - 1,543,040 (5.07%) bytes.
com.radaee.pdfex.PDFViewVert$1 @ 0x418bdf78 - 1,543,040 (5.07%) bytes.
com.radaee.pdfex.PDFViewVert$1 @ 0x41a382f8 - 1,543,040 (5.07%) bytes.
com.radaee.pdfex.PDFViewVert$1 @ 0x41a4df50 - 1,543,040 (5.07%) bytes.
com.radaee.pdfex.PDFViewVert$1 @ 0x41eaf1c0 - 1,543,040 (5.07%) bytes.
com.radaee.pdfex.PDFViewVert$1 @ 0x4202a8e0 - 1,543,040 (5.07%) bytes.
com.radaee.pdfex.PDFViewVert$1 @ 0x421aaa10 - 1,543,040 (5.07%) bytes.
com.radaee.pdfex.PDFViewVert$1 @ 0x4233dbf8 - 1,543,040 (5.07%) bytes.
com.radaee.pdfex.PDFViewVert$1 @ 0x412a0bf0 - 1,543,024 (5.07%) bytes.
com.radaee.pdfex.PDFViewVert$1 @ 0x412bbf58 - 1,390,792 (4.57%) bytes.
com.radaee.pdfex.PDFViewVert$1 @ 0x412f0790 - 1,390,792 (4.57%) bytes.
com.radaee.pdfex.PDFViewVert$1 @ 0x424c4b50 - 1,390,792 (4.57%) bytes.
Keywords
com.radaee.pdfex.PDFViewVert$1
dalvik.system.PathClassLoader @ 0x412a0b08
任何幫助表示贊賞..謝謝,
Java GC不一定清除不再引用的對象。 如果到目前為止有足夠的內存,它可以決定不對它們做任何事情。
只能通過內存分析器對潛在的內存泄漏進行真正的檢查。
但你可以嘗試更容易檢查。 嘗試減少應用程序的堆大小並調用System.gc()
。 這並不能保證觸發GC,但是如果它開始刪除你的對象,那么這可能是你沒有內存泄漏的好跡象。
試試這個:
Runtime.getRuntime().gc();
改變這個
m_vPDF = null;
至,
if (m_vPDF != null){
m_vPDF.recycle();
m_vPDF = null;
}
這將幫助您清理未使用的對象。
希望它能幫到你。
謝謝。
就個人而言,我認為您最好的選擇是使用自定義適配器,這樣它將重用視圖,並且您不會獲得pdfview的23個實例。 它只會保存一個,它會讓你能夠滑動而不是擊中下一個或上一個。 不幸的是,這些設備由於你得到的東西而沒有很多記憶
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.