return new物件造成溢位記憶體

YunSoul發表於2018-08-23

方法中返回的物件,一般不會造成記憶體溢位,但是一下情況就是剛好造成的內容溢位:

如果物件的引用剛好被單例所持有的話,JVM就不會回收該引用


1、建立物件
Info info = new Info();
複製程式碼

new Info()的時候,會返回一個地址,並且將地址賦值給引用info,當這個引用被info持有的時候,java虛擬機器會認為這個物件是有用的,不會回收。

2、方法中返回一個物件
private UiDataCenter.QrInfo genQrcInfo(QrActionInfo info, String aType, String id)
    {
        UiDataCenter.QrInfo qrInfo = new UiDataCenter.QrInfo();

        if(null != info && Ut.isValidate(id) && StringUtil.isValidate(aType))
        {
            qrInfo.mainBatchID = info.mainBatchID;
            qrInfo.subBatchID = info.subBatchID;
            qrInfo.money = info.money;
            qrInfo.qrId = id;
            qrInfo.aType = aType;
        }

        return qrInfo;
    }
複製程式碼

此時返回的是物件的引用。如果該物件的引用的被持有數為0的話,該物件的引用會被Java虛擬機器回收;否則JVM不會回收該引用。


以上操作都不會造成記憶體溢位,剛好造成記憶體溢位的是下方的單例持有該物件的引用。

3、單例持有物件的引用,造成記憶體溢位
UiDataCenter.QrInfo qrInfo = genQrcInfo(qrActionInfo, qrResInfo.actType,qrId)
UiDataCenter.getInstance().setQrInfo(qrInfo);
複製程式碼

上述程式碼中,物件的引用qrInfo剛好被單例所持有。genQrcInfo方法中每new一個物件的引用都被靜態類所持有,所以這些物件的引用都不會被JVM回收,最終造成記憶體溢位。

4、解決方法

講物件設定為靜態成員變數,並在建立物件的時候,判斷物件為空時再建立,否則直接修改物件的屬性。

private static UiDataCenter.QrInfo qrInfo = null;
	private UiDataCenter.QrInfo genQrcInfo(QrActionInfo info, String aType, String id)
    {
        if (qrInfo == null)
        {
            qrInfo = new UiDataCenter.QrInfo();
        }

        if(null != info && Ut.isValidate(id) && StringUtil.isValidate(aType))
        {
            qrInfo.mainBatchID = info.mainBatchID;
            qrInfo.subBatchID = info.subBatchID;
            qrInfo.money = info.money;
            qrInfo.qrId = id;
            qrInfo.aType = aType;
        }

        return qrInfo;
    }
複製程式碼

此時再將物件設定到單例中,也不會造成記憶體的溢位,因為沒有被頻繁的建立物件,單例只會持有一個物件的引用。


#### YunSoul技術分享,掃碼關注微信公眾號##
    ——只要你學會了之前所不會的東西,只要今天的你強過了昨天的你,那你就一直是在進階的路上了。 return new物件造成溢位記憶體

相關文章