1. 程式人生 > 其它 ><5>pytest:前置後置

<5>pytest:前置後置

目錄

System.gc()

呼叫該gc方法表明 Java 虛擬機器將努力回收未使用的物件,以使它們當前佔用的記憶體可用於快速重用。當控制從方法呼叫返回時,Java 虛擬機器已盡最大努力從所有丟棄的物件中回收空間,不能保證一定進行回收。

記憶體溢位

  1. 記憶體溢位(Out Of Memory,簡稱OOM)是指應用系統中存在無法回收的記憶體或使用的記憶體過多、沒有空閒記憶體,最終使得程式執行要用到的記憶體大於能提供的最大記憶體。
  2. 沒有空閒記憶體情況
    2.1 Java虛擬機器的堆記憶體設定不夠
    2.2 程式碼中建立了大量大物件,並且長時間不能被垃圾收集器收集
  3. 在OOM之前,通常垃圾收集器會被觸發,去清理空間

記憶體洩漏

  1. 記憶體洩漏(memory leak)是一種資源洩漏,主因是計算機程式對儲存器配置管理失當,失去對一段已分配記憶體空間的控制,造成程式繼續佔用已經不再使用的記憶體空間,或是儲存器所儲存之物件無法透過執行程式碼而訪問,令記憶體資源空耗。
  2. 也稱作“儲存滲漏”。嚴格來說,只有物件不會再被程式用到了,但是Gc又不能回收他們的情況,才叫記憶體洩漏。
  3. 實際情況很多時候一些不太好的實踐(或疏忽)會導致物件的生命週期變得很長甚至導致OOM,也可以叫做寬泛意義上的“記憶體洩漏”。
  4. 例子
    4.1 單例的生命週期和應用程式是一樣長的,所以單例程式中,如果持有對外部物件的引用的話,那麼這個外部物件是不能被回收的,則會導致記憶體洩漏的產生。
    2.2 資料庫連線(dataSourse.getconnection()) ,網路連線(socket)和io連線必須手動close,否則是不能被回收的。

Stop The World

  1. Stop-The-World ,簡稱STW,指的是GC事件發生過程中,會產生應用程式的停頓。停頓產生時整個應用程式執行緒都會被暫停,沒有任何響應,有點像卡死的感覺,這個停頓稱為STW。
  2. 所有的GC都會有這個事件
  3. 開發中不要用System.gc(),會導致STW的發生

垃圾回收的併發和並行

  1. 併發:指一個時間段中有幾個程式都處於已啟動執行到執行完畢之間,且這幾個程式都是在同一個處理機上執行,但任一個時刻點上只有一個程式在處理機上執行。多個事情在同一時間段內發生了
  2. 多個事情在同一時間點上發生了。
  3. 垃圾收集器語境
    3.1 並行:多條垃圾執行緒並行工作,使用者執行緒處於等待狀態
    3.2 併發:使用者執行緒與垃圾回收執行緒同時執行,垃圾回收執行緒不會影響使用者執行緒

安全點

  1. 程式執行時只能在特定的位置才能定下來GC,這些位置稱為"安全點"
  2. 安全點太少會導致GC等待時間過長,太多會導致執行時的效能問題
  3. 如何確保所有執行緒都在最近安全點?
    3.1 搶先式中斷(目前沒有虛擬機器採用):先中斷所有執行緒,如果還有執行緒不在安全點,就恢復執行緒,讓執行緒跑到安全點
    3.2 主動式中斷:設定一箇中斷標誌,各個執行緒執行到safe Point的時候主動輪詢這個標誌,如果中斷標誌為真,則將自己進行中斷掛起。

安全區域

  1. 安全區域是指在一段程式碼片段中,物件的引用關係不會發生變化,在這個區域中的任何位置開始Gc都是安全的。
  2. 當執行緒執行到safe Region的程式碼時,首先標識已經進入了Safe Region,如果這段時間內發生Gc,JVM會忽略標識為Safe Region狀態的執行緒;
  3. 當執行緒即將離開safe Region時,會檢查M是否已經完成Gc,如果完成了,則繼續執行,否則執行緒必須等待直到收到可以安全離開Safe Region的訊號為止;

引用

強引用

類似於"Object object = new Object()"這樣的引用關係,無論任何情況下,只要強引用關係還在,垃圾回收器永遠不會被引用的物件

軟引用

在系統將要記憶體溢位時,把被軟引用物件列入回收範圍進行第二次回收,如果記憶體還是不夠,丟擲記憶體溢位異常

 SoftReference<Object> softReference = new SoftReference<>(new Object());
 System.out.println("softReference = " + softReference);

弱引用

弱引用與強引用相對,是指不能確保其引用的物件不會被垃圾回收器回收的引用。一個物件若只被弱引用所引用,則被認為是不可訪問(或弱可訪問)的,並因此可能在任何時刻被回收。被弱引用關聯的物件只能生存到下一次垃圾收集發生為止,軟引用、弱引用都非常適合來儲存那些可有可無的快取資料。

WeakReference<Object> softReference = new WeakReference<>(new Object());

虛引用

  1. 一個物件是否有虛引用的存在,完全不會決定物件的生命週期。如果一個物件僅持有虛引用,那麼它和沒有引用幾乎是一樣的,隨時都可能被垃圾回收器回收。
  2. 虛引用的應用場景,主要是少量的技術上的使用, 主要用來跟蹤物件被垃圾回收器回收的活動。
  3. 它可以用來代替 finalize 方法,保證物件在finalize時不會復活(resurrect)。 這允許物件在一個週期內完成垃圾回收,而不需要等待下一個垃圾回收週期以確保它沒有復活。
  4. 第二個用途是來檢測物件被回收的具體時間(通過與 ReferenceQueue 物件配合使用),確保其記憶體空間可用。
  Object o = new Object();
  ReferenceQueue<Object> referenceQueue = new ReferenceQueue<Object>();
  PhantomReference<Object> phantomReference = new PhantomReference<Object>(o, referenceQueue);
  o = null;

終結器引用(Final reference)

  1. 它用以實現物件的finalize ()方法,也可以稱為終結器引用。
  2. 無需手動編碼,其內部配合引用佇列使用。
  3. 在GC時,終結器引用入隊。由Finalizer執行緒通過終結器引用找到被引用物件並呼叫它的finalize ()方法,第二次Gc時才能回收被引用物件。