1. 程式人生 > >初始化與清理之二(清理)

初始化與清理之二(清理)

前言

初始化往往是程式設計師呼叫方法前所必須做的事情,但物件用完之後的清理卻常常忽略。對於清理,java中提供了垃圾回收器機制,通常情況下不必由程式設計師關心如何清理的問題;垃圾回收機制在便利的同時也引發兩個問題:一是垃圾回收器只能回收由new分配的記憶體空間,對於一些特殊記憶體分配方式,是無法回收的;二是記憶體回收是一個自動的過程,可能發生也可能不發生,如果java虛擬機器在並未面臨記憶體耗盡的情形,它是不會浪費時間去執行垃圾回收以回收記憶體。

工作機理

對於上述第一種情況,在java中一切皆物件,那什麼是非new方式分配記憶體呢?這樣的情況主要發生在使用“本地方法”(用於呼叫非java程式碼的方式,目前只支援C和C++)的情況下,可能利用malloc這種方式分配了記憶體;為了這種情況,java允許在類中定義finalize()方法,垃圾回收器一旦準備清理某物件,先呼叫其finalize()方法,然後在下一次垃圾回收時回收其記憶體。

對於第二種情況,我們無法要求垃圾回收器立即回收物件,普通的清理工作只能定義普通java方法,明確的呼叫它來做一些清理工作。

finalize()的特殊用法

finalize()可以用作對終結條件的判斷,雖然不是肯定會被呼叫,這樣就有可能使得某些程式缺陷被發現。

問題

當物件被回收時,是否會先回收其內部所含物件?

class A {
    private B b;
    private C c;

    public A(B b) {
        this.b = b;

    }
    public void setC() {
        c = new
C(); } public C getC() { return c; } @Override protected void finalize() throws Throwable { // TODO Auto-generated method stub super.finalize(); System.out.println("A finalize"); } } class B { @Override protected void finalize() throws
Throwable { // TODO Auto-generated method stub super.finalize(); System.out.println("B finalize"); } } class C { @Override protected void finalize() throws Throwable { // TODO Auto-generated method stub super.finalize(); System.out.println("C finalize"); } } public class clean { public static void main(String[] args) { // 被引用 答案是不會 /*B b = new B(); System.out.println("1-------------------"); System.gc();// 建議jvm回收記憶體,並不一定會執行回收操作 // 引用置為null 答案是會 b = null; System.out.println("2-------------------"); System.gc(); */ // A物件回收時如何做 // new A(null).getC();//A先 C後 // new A(null);//C先 A後 new A(null).setC();//C先 A後 System.out.println("3-------------------"); System.gc(); // A物件有引用,B物件是否會被回收 答案是不會 /* * A a = new A(new B()); System.out.println("4-------------------"); * System.gc(); */ } }

結論:
1.當物件回收時,如果其內部物件沒有在其他地方引用,那麼會先回收其內部物件
2.將物件引用置為null或其他物件,原引用物件就引用數就會減少
3.方法內部建立的引用變數,在整個方法執行鏈(指方法呼叫其他方法這樣一個巢狀呼叫)結束後,該引用變數才會釋放引用
4.內部物件被返回時,就算返回值沒有被其他引用變數所持有,內部物件也會後於外部物件回收,其原因是有中間引用???(暫時不明確,留待以後)

相關推薦

初始清理清理

前言 初始化往往是程式設計師呼叫方法前所必須做的事情,但物件用完之後的清理卻常常忽略。對於清理,java中提供了垃圾回收器機制,通常情況下不必由程式設計師關心如何清理的問題;垃圾回收機制在便利的同時也引發兩個問題:一是垃圾回收器只能回收由new分配的記憶體空間

coding git 初始專案遠端連線

git 的安裝與配置 一.git簡介 Git是一款免費、開源的分散式版本控制系統。git 的速度很快,對於我們做一些很大的專案來說就方便了很多。 二.git 的下載與安裝 下載地址:https://git-scm.com/download

資料結構演算法棧常見案例

棧是一種常用資料結構,其特性是FILO(first in last out),其基本概念這裡不做介紹,相信都學過了。直接食用java中已經封裝好Stack<>類。 棧的效率:入棧出棧複雜度為O(1),不需要比較和移動操作。 案例1:單詞逆序 比

學習hibernate出現錯誤--方言

pda data cells bird nbsp 版本問題 inno 提高 語言 最近在學習hibernate,其中關於錯誤的問題真是一頭大,各種各樣的奇葩錯誤層出不窮,簡直是受不了了。 用hibernate操作數據庫,在使用hibernate進行把持久

kubernetes實戰Pod

namespace temp 準備 版本 containe tcp esp .cn lur Pod是kubernetes的基本操作單元,也是應用運行的載體。整個kubernetes系統都是圍繞著Pod展開的,比如如何部署運行Pod、如何保證Pod的可靠性、如何訪問Pod等。

裝置IODMA

DMA是硬體的一種能力,具備這種能力的硬體可以直接從主存中讀寫資料,也就是它可以直接使用主存進行I/O而不需要處理器的干預,這可以節省處理器資源並提高整個系統的IO吞吐量,因為IO操作相對來說是較慢的,如果每個IO都要使用處理器資源,則毫無以為會耗費大量CPU時間在單個IO上,最終導致系統IO效能下

基於Springboot技術的部落格系統實踐及應用thymleaf

一、概念             Thymleaf是一個jave模板引擎,與SpringBoot整合 非常方便,類似於Freemarker,但是比Freemarker效能要好一些;Thymleaf支援自然語言,即:原型就是

thinking in java (九) ----- 陣列Array

效能 在java中有一系列的方式可以用來作為存放物件的容器,並且有很多在操作上比陣列要簡單。但是我們仍然會使用陣列。因為陣列有自己的優點,效率,型別和儲存基本型別的能力。在java中,陣列是效率最高的儲存和隨訪問物件引用序列的方式。 在一般的專案中,確實陣列是咩有List,Ma

2018.11.18 bzoj2194: 快速傅立葉fft

傳送門 模板題。 將 b b b序列反過來然後上

[PyTorch]PyTorch中模型的參數初始的幾種方法

plane alt align frame nor view tps class normal ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~本文目錄1. xavier初始化2. kaiming初始化3. 實際使用中看到的初始化3.1 ResN

極客講堂資料結構演算法:複雜度分析

(本文根據極客講堂——資料結構與演算法之美專欄的問答區整理修改而成,如有侵權還希望聯絡我鴨~) 一、什麼是複雜度分析? 1.資料結構和演算法解決是“如何讓計算機更快時間、更省空間的解決問題”。 2.因此需從執行時間和佔用空間兩個維度來評估資料結構和演算法的效能。 3.分別

資料結構演算法:陣列

陣列看起來簡單基礎,但是很多人沒有理解這個資料結構的精髓。帶著為什麼陣列要從0開始編號,而不是從1開始的問題,進入主題。 一、 如何實現隨機訪問 1) 陣列是一種線性資料結構,用連續的儲存空間儲存相同型別資料: I) 線性表:陣列、連結串列、佇列、棧 ;非線性表

輕鬆精通資料庫管理道——運維巡檢資料庫

前言   做好日常巡檢是資料庫管理和維護的重要步驟,而且需要對每次巡檢日期、結果進行登記,同時可能需要出一份巡檢報告。   本系列旨在解決一些常見的困擾: 不知道巡檢哪些東西 不知道怎麼樣便捷體檢 機器太多體檢麻煩 生成報告困難,無法直觀呈現結果   經過硬體巡檢,資料庫狀態情況的巡

抄襲轉載思考3

這是一篇與程式碼並無關係的文章,從這裡也並不能學習到任何方法和經驗,有的就只是我個人的一點點小看法,和些許摻雜各種憤恨等情緒的牢騷。     言歸正傳,我從17年底開始接觸大資料方面,一點點學習與積累,是一個小公司的一個新入職的小職員,真的是名不見經傳。不知道為何“平臺”會

Python Web:Django學習實踐models

          Django 模型是與資料庫相關的,與資料庫相關的程式碼一般寫在 models.py 中,Django 支援 sqlite3, MySQL, PostgreSQL等資料庫,只需要在settings.py中配置即可,不用更改models.py中的程式碼,豐富

資料結構演算法排序2選擇排序 ——in dart

  選擇排序的演算法複雜度與氣泡排序類似,其比較的時間複雜度仍然為O(N2),但減少了交換次數,交換的複雜度為O(N),相對氣泡排序提升很多。演算法的核心思想是每次選出一個最小的,然後與本輪迴圈中的第一個進行比較,如果需要則進行交換。 1 import 'dart:math' show Random

java資料結構演算法Stack設計實現

關聯文章:   本篇是java資料結構與演算法的第4篇,從本篇開始我們將來了解棧的設計與實現,以下是本篇的相關知識點: 棧的抽象資料型別   棧是一種用於儲存資料的簡單資料結構,有點類似連結串列或者順序表(統稱線性表),棧與線性表的最大區別是

資料結構演算法Stack——in dart

用dart 語言實現一個簡單的stack(棧)。 1 class Stack<E> { 2 final List<E> _stack; 3 final int capacity; 4 int _top; 5 6 Stack(this.capacit

MATLAB下機器人視覺控制---simulink篇1

     1、前記:按照一定的套路,在開篇之前先如下方式開車---自行車(自己學習的總結)。 從 URDF 或 Simscape 多體 XML 檔案中匯入多體模型 步驟  1)裡的視覺化和控制已經瞭解了。 步驟  2)的方式就是今天的主

資料結構演算法Stack的應用——in dart

  參考教科書上的一個應用例子,用棧來分析一行輸入中的括號brackets是否匹配。用stdin讀取使用者輸入,並輸出檢查結果。exit 退出。 注意這行程式碼: import 'stack.dart';// 需要與上一個Stack的例子在同一個資料夾下。 1 import 'dart:io';