說到java對象的建立,首先應該提下java的內存機制,最主要的兩塊應該就是堆內存和棧內存。java
簡單點來講棧內存主要是保存基本數據類型的值和保存引用變量,堆內存主要用來存放new產生的對象,數組。數據庫
堆是被全部線程共享的一塊內存區域,在虛擬機啓動的時候被建立。個人理解就是堆是用來存放實實在在東西的,而棧只是用來存放一個編號的。數組
比如你是個真實存在的人(編號9527,這個就是那些棧中引用指向的地方),你就是放在堆中,你的名字叫張三,而這個張三是放在棧中一個引用變量,你也能夠有一個小名叫李二狗,這個李二狗和張三都是指向堆中9527這個對象。安全
其次還有方法區。方法區用來存放已被加載的類的信息、常量、靜態變量。常量池是在方法區中而不是堆內存中,」AAA「字符串是在常量池的 ,new String(」AAA「),會在常量建立一個」AAA「字符串,還會在堆中建立一個字符串對象。jvm
對象的建立:工具
1.避免建立沒必要要的對象,避免在方法內部建立對象,由於若是在方法內部建立對象XX xxx = new XXX();不考慮線程安全的條件下若是有N個線程調用該方法,那麼就會建立N個XXX對象。線程
2.考慮使用單例模式對象
3.一些不須要改變的工具類可使用static靜態代碼塊來初始化。private static final XXX xxx;static {xxx = new XXX();},首先static 修飾的字段是屬於類的,全部對象均可以使用,其次靜態代碼塊只會在類加載的時候初始化一次也就只會建立一個XXX對象。內存
4.儘可能使用基礎數據類型,避免使用包裝類,一是拆箱裝箱耗時,二是對象比基礎數據更佔內存。能夠試試:Long sum = 0L;for(int i = 0;i<Integer.MAX_VALUE;i++){sum += i;},將sum的生命改爲基礎數據類型long再試試。資源
對象的銷燬:java中若是一個棧先增加,再收縮,那麼從棧中彈出來的對象不會被看成垃圾回收,即便棧中已經再也不引用這些對象。由於棧中還維護對這些對象的過時引用(永遠也不會再被解除的引用)
1.某些狀況下,能夠考慮將某些引用置空告訴jvm這個對象已經沒有引用了;即便後面再有使用也會拋出空異常,很快即可以發現問題。
2.避免調用finalizer 方法,子類若是重寫該方法清除一些資源,切記在重寫方法中還要手動調用父類的該方法super.finalizer ();並且最好是在finally中調用,保證無論發生什麼異常父類的finalizer 方法都會執行
3.能夠考慮提供一些清理資源的方法。好比io流相關類都提供close方法,數據庫鏈接Connection也有close關閉鏈接