方法中返回的物件,一般不會造成記憶體溢位,但是一下情況就是剛好造成的內容溢位:
如果物件的引用剛好被單例所持有的話,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技術分享,掃碼關注微信公眾號##
-
——只要你學會了之前所不會的東西,只要今天的你強過了昨天的你,那你就一直是在進階的路上了。