這篇文章簡要概述了Java 7中引入的稱為自動資源管理或ARM的新功能。 文章探討了ARM如何減少開發人員為有效釋放分配的資源的JVM堆而必須編寫的代碼。
Java編程語言中編程的最甜蜜之處之一是對象取消分配的自動處理。 在Java世界中,這通常被稱為垃圾收集。 基本上,這意味著開發人員不必擔心取消分配其代碼分配的對象。 開發人員使用完該對象后,他便可以使對該對象的所有引用無效,然后該對象就有資格進行垃圾回收。
但是,垃圾收集有其另一面。 與C / C ++中的編碼器完全控制內存分配和取消分配(malloc,free,new,delete等)不同,在Java中,開發人員對對象的取消分配過程沒有明顯的控制。 JVM管理未使用對象的垃圾回收過程,而運行一個垃圾回收周期實際上取決于JVM的想法。 確實,有諸如System.gc()或Runtime.getRuntime()。gc()之類的方法調用,它們指示將運行垃圾回收,但是這些方法僅用于提醒JVM:“也許您需要運行垃圾現在收集,只是一個建議,沒有壓力!”。 JVM被完全授權忽略這些請求,并且被編碼為僅在真正合適時運行垃圾回收。 因此,在實踐中,始終建議開發人員不要相信System.gc()或Runtime.getRuntime()。gc()將觸發完整的垃圾回收,從而不要構建其程序邏輯。
無可否認,自動垃圾收集為提高開發人員的生產力做了多少工作。 但是,在某些極端情況下,垃圾回收不足以保持“干凈”堆,其中沒有未使用的對象。 尤其是當對象處理由底層操作系統提供服務的某種形式的本機資源時。 這些對象包括但不限于IO流,數據庫連接等。對于此類對象,開發人員必須明確釋放資源。 通常,這些是通過try-catch塊完成的。
讓我們看一個小示例,該示例在完成流處理之后關閉InputStream:
InputStream in = null;try
{in = new FileInputStream(new File("test.txt");//do stuff with in
}
catch(IOException ie)
{//SOPs
}
finally
{//do cleanup
}
以上看起來不錯,干凈; 但是,一旦我們嘗試通過finally塊中的in.close()關閉輸入流,就需要用try-catch塊將其包圍,該塊捕獲已檢查的異常IOException。 因此,代碼示例將轉換為:
InputStream in = null;try
{in = new FileInputStream(new File("test.txt"));//do stuff with in
}
catch(IOException ie)
{//SOPs
}
finally
{try{in.close();}catch(IOException ioe){//can't do anything about it}
}
現在,上面的代碼看起來很腫,并且在不同層次結構中有多種檢查異常,我們需要更多的catch子句。 很快,代碼變得冗長且難以維護,更不用說代碼失去了其最初的簡潔外觀,甚至吸引了人們的目光。
但是有個好消息。
Java 7通過新的try-catch塊使此操作更容易。 使用此功能,我們可以避免finally塊本身。 這是我們的做法:
try(InputStream in = new FileInputStream(new File("test.txt"))
{//do stuff with in
}
catch(IOException ie)
{//SOPs
}
上面的代碼塊將自己進行清理。 通過引入新接口java.lang.AutoCloseable使其成為可能,該接口定義了單個方法void close()throws Exception 。 使用上述語法,可以自動關閉()d此接口子類型的對象。 以上功能適用于實現AutoCloseable接口的任何類的對象。
最好的部分是,即使我們在try()塊中初始化了多個AutoCloseable實例,它也會為所有對象調用close()方法,即使某個對象上的某些close()方法拋出任何異常。
在處理異常時,如果在try塊以及隱式finally塊(實際上已關閉AutoCloseable的塊)中存在任何IOException,則拋出的異常將是在try塊中拋出的異常而不是隱式的finally塊中的那個。
但是,我們仍然可以從Throwable.getSuppressed()方法中獲取隱式finally塊異常的詳細信息,該方法作為Java 7中的新方法添加。
我認為自動資源管理功能或ARM是Java 7的重要補充。
編碼愉快!
參考: Java HotSpot博客上的JCG合作伙伴 Swaranga提供了Java 7中具有自動資源管理功能的垃圾收集 。
相關文章 :
- Java 7:嘗試資源
- 速覽Java 7 MethodHandle及其用法
- Java Fork / Join進行并行編程
- JDK中的設計模式
- Java最佳實踐
翻譯自: https://www.javacodegeeks.com/2011/08/gc-with-automatic-resource-management.html