java循環引用
GC Root在對象圖之外,是特別定義的「起點」,不可能被對象圖內的對象所引用。
一個常見的誤解是以為GC Root是一組對象。
實際情況是GC Root通常是一組特別管理的指針,這些指針是tracing GC的trace的起點。它們不是對象圖里的對象,對象也不可能引用到這些「外部」的指針,所以題主想像的情況無法成立。
另外,tracing GC能正確處理循環引用,保證每個活對象只會被訪問一次就能確定其存活性。對象圖里是否存在循環引用,tracing GC都能正確判斷對象的存活與否。
2. java 什麼資源需要手動釋放
1、文件流要釋放
2、資料庫連接資源要釋放
3、在結合使用hibernate時,session要釋放
在使用的時候,java的垃圾回收一般不用手動釋放,但是可以調用方法進行調用以實現垃圾回收,在某種特定情況下會使用到
3. java 被引用的對象怎麼回收
java對象符合以下條件便會被垃圾回收:
1.所有實例都沒有活動線程訪問。
2.沒有被其他任何實例訪問的循環引用實例。
3.Java 中有不同的引用類型。判斷實例是否符合垃圾收集的條件都依賴於它的引用類型。
4. GSON:如何在保留循環引用的同時防止
Gson本身並不提供循環引用的直接解決方案。我們可以通過以下方式來解決循環引用的問題:
使用ava關鍵字transient
Java代碼
private transient int value = 3;
在序列化的時候value不會生成到json字元串中。
使用Gson提供的註解@Expose
Java代碼
@Exclude
private String value;
當然,要使用這個屬性必須通過以下語句來構造Gson對象
Java代碼
new GsonBuilder().().create()
我們也可以自定義註解來標注需要過濾的屬性,參見官方的User Guide,需要使用到過濾策略,在下文也會提到。
使用排除策略
以上只能是通過「硬編碼」的方式來排除屬性,有些時候我們需要根據某種來選擇性得過濾一些屬性。這是我們可以使用使用Gson提供的排除策略ExclusionStrategy介面。如:
Java代碼
public class MyExclusionStrategy implements ExclusionStrategy {
private MyExclusionStrategy(Class<?> typeToSkip) {
}
public boolean shouldSkipClass(Class<?> clazz) {
return false;
}
public boolean shouldSkipField(FieldAttributes f) {
return false;
}
}
我們可以通過類級別和屬性級別來過濾屬性。以上提到的關於自定義註解的實現是在屬性級別上實現的。具體方法是
Java代碼
public boolean shouldSkipField(FieldAttributes f) {
// Foo是一個自定義註解
return f.getAnnotation(Foo.class) != null;
}
一般情況下,我們可以通過根據屬性名的判斷來實現實現邏輯過濾。當然,在序列化之前,需要用一下代碼來構造Gson對象:
Java代碼
Gson gson = new GsonBuilder()
.setExclusionStrategies(new MyExclusionStrategy(SomeObject.class))
.create();
自定義序列化器
在有些情況下,我們可能會為某一個類來綁定一種序列化或反序列化器。
Java代碼
public class MyAdaper1 implements JsonSerializer<DataStore> {
@Override
public JsonElement serialize(DataStore src, Type typeOfSrc,
JsonSerializationContext context) {
ExclusionStrategy strategy = new DmsExclusionStrategy(
src.getExcludeFields(), src.getExcludeClasses());
Gson gson = new GsonBuilder().setExclusionStrategies(strategy)
.serializeNulls().create();
return gson.toJsonTree(src);
}
}
注冊序列化器:
Java代碼
GsonBuilder builder = new GsonBuilder();
builder.registerTypeAdapter(MyType1.class, new MyTypeAdapter())
.registerTypeAdapter(MyType2.class, new MyTypeAdapter2());
5. JAVA對象循環引用的問題
import java.io.*;
public class Collect {
/**
* @param args
*/
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
File f=new File("c:\\france.txt");
RandomAccessFile mm = new RandomAccessFile(f,"rw");
Item[] qq= new Item[1000];
for (int i = 0; i < 1000; i++) {
qq[i] = new Item();
}
for (int h = 0; h < 10; h++) {
qq[h].title=mm.readLine();
qq[h].content=mm.readLine()+"\n"+mm.readLine()+"\n"+mm.readLine();
qq[h].getInfo();
}
}
}//此處再加一個大括弧,並且不能在最後加大括弧,除非你把下面的類當成靜態內部類
class Item{
String title;
String content;
public void getInfo(){
System.out.println(title);
System.out.println(content);
}
}
6. java gc引用計數法循環引用會發生什麼情況
會發生檢測不出循環引用的情況
7. java怎麼循環new不同引用的對象
你的意思是說比如我有一個user對象和一個rose對象,循環從內存中取出?還是循環new?
循環取出可以定義一個集合,把對象放進去循環取出;
循環new直接在循環里new就行了.