jvm引用例項分析(強引用,軟使用,弱引用,虛引用)
強引用(Strong Reference)
強引用是指在程式程式碼中普遍存在的,類似“Object obj=new Object()”這類的引用,只要強引用還存在,垃圾收集器永遠不會回收掉被引用的物件。
- publicclass StrongReferenceTest {
- privatestaticclass BiggerObject{//佔用空間的一個大物件
- publicint[] values;
- public String name;
- public BiggerObject(String name){
-
this
- values=newint[1024];
- }
- }
- publicstaticvoid main(String[] args) {
- int count=10000;//物件的個數,保證使得堆記憶體溢位
- BiggerObject[] values=new BiggerObject[count];
- for(int i=0;i<count;i++){
- values[i]=new BiggerObject("Object-"+i);
-
}
- for(int i=0;i<10;i++){
- System.out.println(values[i].name);
- }
- }
- }
Java.lang.OutOfMemoryError: Java heap
space
Dumping heap to java_pid668.hprof ...
Heap dump file created [13980085 bytes in 0.181 secs]
Exception in thread "main" java.lang.OutOfMemoryError:
at StrongReferenceTest$BiggerObject.<init>(StrongReferenceTest.java:8)
at StrongReferenceTest.main(StrongReferenceTest.java:15)
因為垃圾收集器無法回收強引用關聯著的物件,從而導致堆記憶體溢位。
軟引用(Soft Reference)
用來描述一些還有用並非必要的物件。對於軟引用關聯著的物件,在系統將要發生記憶體溢位異常之前,將會把這些物件列入回收範圍進行第二次回收。如果這次回收還沒有足夠的記憶體,才會丟擲記憶體溢位異常。JDK 1.2之後,提供了SoftReference類來實現軟引用。
- import java.lang.ref.SoftReference;
- publicclass SoftReferenceTest {
- privatestaticclass BiggerObject{//佔用空間的一個大物件
- publicint[] values;
- public String name;
- public BiggerObject(String name){
- this.name=name;
- values=newint[1024];
- }
- }
- publicstaticvoid main(String[] args) {
- int count=100000;//物件數量為100000,保證使得堆記憶體溢位
- SoftReference[] values=new SoftReference[count];
- for(int i=0;i<count;i++){
- values[i]=new SoftReference<BiggerObject>(new BiggerObject("Object-"+i));
- }
- System.out.println(((BiggerObject)(values[values.length-1].get())).name);
- for(int i=0;i<10;i++){
- System.out.println(((BiggerObject)(values[i].get())).name);
- }
- }
- }
Object-99999
Exception in thread "main" java.lang.NullPointerException
at SoftReferenceTest.main(SoftReferenceTest.java:21)
第一行輸出說明,使用軟引用後,原本由於堆記憶體溢位而無法正常執行的程式碼段“正常的”執行成功;
但是,當我們訪問早期建立的那些物件時,卻報java.lang.NullPointerException異常,說明早期建立的物件已經被垃圾收集器回收了。
- import java.lang.ref.SoftReference;
- publicclass SoftReferenceTest {
- privatestaticclass BiggerObject{//佔用空間的一個大物件
- publicint[] values;
- public String name;
- public BiggerObject(String name){
- this.name=name;
- values=newint[1024];
- }
- }
- publicstaticvoid main(String[] args) {
- int count=100;//物件數量改為100,保證堆記憶體不會溢位
- SoftReference[] values=new SoftReference[count];
- for(int i=0;i<count;i++){
- values[i]=new SoftReference<BiggerObject>(new BiggerObject("Object-"+i));
- }
- System.gc();//強制進行垃圾回收
- System.out.println(((BiggerObject)(values[values.length-1].get())).name);
- for(int i=0;i<10;i++){
- System.out.println(((BiggerObject)(values[i].get())).name);
- }
- }
- }
輸出:
Object-99
Object-0
Object-1
Object-2
Object-3
Object-4
Object-5
Object-6
Object-7
Object-8
Object-9
當堆記憶體足夠時,即使我們強制進行垃圾回收,軟引用關聯著的物件也不會被回收。
弱引用(WeakReference)
弱引用也是用來描述非必要物件的,但是他的強度比軟引用更弱一些,被軟引用關聯的物件只能生存到下一次垃圾收集發生之前。當垃圾收集器工作時,無論當前記憶體是否足夠,都會回收掉只被弱引用關聯的物件。JDK 1.2之後,提供了WeakReference類來實現弱引用。
- publicclass WeakReferenceTest {
- privatestaticclass BiggerObject{//佔用空間的一個大物件
- publicint[] values;
- public String name;
- public BiggerObject(String name){
- this.name=name;
- values=newint[1024];
- }
- }
- publicstaticvoid main(String[] args) {
- int count=10000;//物件數量為10000,保證使得堆記憶體溢位
- WeakReference[] values=new WeakReference[count];
- for(int i=0;i<count;i++){
- values[i]=new WeakReference<BiggerObject>(new BiggerObject("Object-"+i));
- }
- System.out.println(((BiggerObject)(values[values.length-1].get())).name);
- for(int i=0;i<10;i++){
- System.out.println(((BiggerObject)(values[i].get())).name);
- }
- }
- }
Object-9999
Exception in thread "main" java.lang.NullPointerException
at WeakReferenceTest.main(WeakReferenceTest.java:22)
輸出結果,與軟引用相同。
- publicclass WeakReferenceTest {
- privatestaticclass BiggerObject{//佔用空間的一個大物件
- publicint[] values;
- public String name;
- public BiggerObject(String name){
- this.name=name;
- values=newint[1024];
- }
- }
- publicstaticvoid main(String[] args) {
- int count=100;//物件數量改為100,保證堆記憶體不會溢位
- WeakReference[] values=new WeakReference[count];
- for(int i=0;i<count;i++){
- values[i]=new WeakReference<BiggerObject>(new BiggerObject("Object-"+i));
- }
- System.out.println(((BiggerObject)(values[values.length-1].get())).name);
- for(int i=0;i<10;i++){
- System.out.println(((BiggerObject)(values[i].get())).name);
- }
- }
- }
Object-99
Object-0
Object-1
Object-2
Object-3
Object-4
Object-5
Object-6
Object-7
Object-8
Object-9
當堆記憶體夠用時,正常輸出。
- publicclass WeakReferenceTest {
-
相關推薦
jvm引用例項分析(強引用,軟使用,弱引用,虛引用)
強引用(Strong Reference) 強引用是指在程式程式碼中普遍存在的,類似“Object obj=new Object()”這類的引用,只要強引用還存在,垃圾收集器永遠不會回收掉被引用的物件。 publicclass StrongReferenceTes
python的引用計數分析(二)
裏的 %20 賦值 手動 計數 python 作用域 新的 pri python所有對象引用計數被減少1的情況: 一.對象的別名被賦予新的對象; a = 23345455 # 增加了一個引用 b = a # 增加了一個引用 print(sys.getrefcount(
Java引用詳解(強引用、軟引用、弱引用、虛引用)
強引用(Strong Reference) 強引用是指在程式程式碼中普遍存在的,類似“Object obj=new Object()”這類的引用,只要強引用還存在,垃圾收集器永遠不會回收掉被引用的物件。 public class StrongReferenceTest {
關於nspm品類產品在行業用戶網絡架構中的研究分析(建議安全自動化運維工具開發者,了解)
nspm產品如何提升安全運維為配合NSPM產品在不同行業不同類型的網絡架構中最大限度的發揮產品優勢,探索不同網絡架構中對產品的適配性。分多個行業目前的傳統網絡架構與未來演進的架構進行深入調研。 從目前數據中心所使用協議的數據層上看,IT方案都是以二/三層網絡(例如以太網+IP網絡)為基礎的,例如GRE、VXL
java中強引用、軟引用、弱應用、虛引用
虛引用:“虛引用”顧名思義,就是形同虛設,與其他幾種引用都不同,虛引用並不會決定物件的生命週期。如果一個物件 僅持有虛引用,那麼它就和沒有任何引用一樣,在任何時候都可能被垃圾回收。 虛引用主要用來跟蹤物件被垃圾回收的活動。虛引用與軟引用和弱引用的一個區別在於:虛引用必須和引用佇列 (ReferenceQue
圖的BFS和DFS原理及例項分析(java)
BFS和DFS是圖的兩種遍歷方式,是最簡單的圖搜尋演算法。 本文將給出給出BFS和DFS的以下幾種實現方式: 1、使用佇列Queue實現圖的BFS遍歷 2、遞迴實現圖的DFS遍歷 3、使用棧Stack迭代實現圖的DFS遍歷 一、BFS(廣度優先搜尋
【OpenGL】Shader例項分析(七)- 雪花飄落效果
研究了一個雪花飄落效果,感覺挺不錯的,分享給大家,效果如下: 程式碼如下: Shader "shadertoy/Flakes" { // https://www.shadertoy.com/view/4d2Xzc Properties{ iMouse ("Mo
Java Class檔案結構例項分析(下)
發表文章之後,發現很多圖片顯示不了,請閱讀我的公眾號文章,以獲得本文最佳體驗: 本篇我們繼續分析Class檔案結構的方法及屬性部分內容,上節內容回顧請檢視: Class檔案格式資訊 繼續上節例項程式碼 package chapter6; public
【OpenGL】Shader例項分析(四)- 照片閃光,圓角和遮罩
在遊戲中,當戰鬥結束後,對一些獲取的寶貝需要進行閃光處理。這篇文章介紹一個進行閃光處理的shader,執行效果如下: 程式碼如下: Shader "stalendp/imageShine" { Properties { _i
Linux\Unix IPC程序通訊例項分析(一):共享記憶體通訊---系統V
前些天看到有個博主寫部落格採用問答式的敘述方法:把很多知識點通過一問一答的形式把文章串起來,我覺得這種形式不錯,便於突出重點。後面我也做下嘗試,一邊寫寫部落格,一邊回顧一下自己對IPC程序通訊的認識。 Q:這些例子來自哪? Q:IBM原文都寫過了,為什麼還要在這裡再寫一
Java Class檔案結構例項分析(上)
發表文章之後,發現很多圖片顯示不了,請閱讀我的公眾號文章,以獲得本文最佳體驗: 本文假定讀者對Java Class檔案格式有一些基本的瞭解,建議結合相關書籍進行對照閱讀。 Class檔案格式資訊 例項程式碼 package chapter6; public
cocos2d-x 強大的shader系列:【OpenGL】Shader例項分析(一)-Wave
這篇文章主要分析一個Shader,從而感受shader的魅力,並學習相關shader的函式的用法。 下面是程式碼: Shader "shadertoy/Waves" { //see https://www.shadertoy.com/view/4dsGz
【OpenGL】Shader例項分析(九)- AngryBots中的主角受傷特效
AngryBots是Unity官方的一個非常棒的例子,很有研究價值。以前研究的時候,由於其內容豐富,一時間不知道從哪入手寫文章分析。這一段時間研究shader技術比較多一些,就從shader的這一方面開始吧。首先分析其中的一個螢幕特效:當主角受到攻擊時會出現的全屏效果(p
Android O Settings原始碼流程分析(資料載入之獲取及修改預設設定屬性值)
Android O Settings 靜態介面篇 介面渲染篇 資料載入篇之一級選單 資料載入篇之二級選單 資料載入篇之獲取及修改預設設定屬性值 搜尋欄篇 載入預設設定值及修改:(涉及SettingsProvider) 示例:(裝置自動亮
第五課 迷你商學院案例分析(全域性、辯證、換位思維——不要斬釘截鐵的下結論)
1. 待人熱情,對建立良好的人際關係重要嗎? 分析:建立良好的人際關係有很多重要的影響因素:真誠、工作出色、敬業、善良(全域性思維),待人熱情,是一個基本禮貌,是重要的。但我覺得價值匹配才是良好人際關係的根本,比如求職,HR要找一個匹配職位需求的、能為公司創造價值的求職者(別人舒服嗎?),求職者要找一個符合
解決 mklink 使用中的各種坑(硬連結,軟連結/符號連結,目錄連結)
通過 mklink 命令可以建立檔案或資料夾的連結,而這種連結跟快捷方式是不一樣的。然而我們還可能會遇到其使用過程中的一些坑,本文將整理這些坑並提供解決方法。 0x00 背景介紹:mklink mklink 可以像建立快捷方式一樣建立檔案或資料夾
Hibernate物件三種狀態詳細分析(轉自http://blog.csdn.net/redarmy_chen/article/details/7069482)
在hibernate中有三種狀態:瞬時態(Transient)、 持久態(Persistent)、脫管態(Detached)。處於持久態的物件也稱為PO(Persistence Object),瞬時物件和脫管物件也稱為VO(Value Object)。通過自己在網上的搜尋,
IOS微信6.7.4輸入框失去焦點,軟鍵盤關閉後,被撐起的頁面無法回退到原來正常的位置
IOS微信6.7.4輸入框失去焦點,軟鍵盤關閉後,被撐起的頁面無法回退到原來正常的位置 近期在開發微信H5頁面時碰到這個問題,如圖,軟鍵盤彈起後,若原輸入框被遮擋,頁面整體將會上移,然而當輸入框失焦,軟鍵盤收起後,頁面未恢復,這也是ios的微信版本更新6.7.4之後才
H5,軟鍵盤彈出,頁面變形問題
對於其它的標籤,不要使用top屬性,可以用外邊距margin(例如margin-top)屬性。對於背景圖片,高度不要用css設定,用js動態載入設定,就ok了; 例如:背景圖片: <img src="p.jpg" class="bj"/>.bj{wid
UNIX硬連結,軟連結(符號連結),檔案複製
學習APUE第四章被硬連結和符號連結搞的頭暈,下面綜合網上和課本資料總結如下: 一.首先在區別前得搞清楚UNIX檔案系統的基本結構 (2).基本結構:即檔案系統是如何管理資料的,也就是資料結構的型別,此處所講的是inode資料結構。 (3)inode資料結構:(摘自鳥哥私