了解Java弱引用

我最近沒來得及關注該博客,最重要的是,我沒有為與技術界的所有人保持聯系而致歉。 我最近偶然發現了Java 1.2以來提供的java.lang.ref包,但具有諷刺意味的是,幾天前我才知道它。 在瀏覽了幾篇有關各種引用類型和java doc的文章時,我非常著迷,并渴望著手使用一些與引用相關的代碼。

我不是要談的java.lang.ref包中可用的每個引用類,因為它已經是很好的解釋在這里 。 讓我們看一下我編寫的以下代碼片段,以了解WeakReference的基本操作。

import java.lang.ref.WeakReference;  
import java.util.HashMap;  
import java.util.Map;  public class ReferencesTest {  private WeakReference<Map<Integer, String>> myMap;  public static void main(String[] args) {  new ReferencesTest().doFunction();  }  private void doFunction() {  Map<Integer, String> map = new HashMap<Integer, String>();  myMap = new WeakReference<Map<Integer, String>>(map);  map = null;  int i = 0;  while (true) {  if (myMap != null && myMap.get() != null) {  myMap.get().put(i++, "test" + i);  System.out.println("im still working!!!!");  } else {  System.out  .println("*******im free*******");  }  }  }  
}

首先,我定義了一個弱引用實例變量,向其分配在doFunction()方法中初始化的HashMap實例。 然后,數據通過弱引用實例而不是直接通過我們創建的哈希圖的具體實例輸入到地圖。 由于WeakReferences的工作方式,我們檢查地圖是否為空。

在程序執行期間,如果沒有軟引用或強引用綁定到弱引用,則將首先對其進行垃圾收集。 因此,如果內存相當低,或者垃圾收集器認為適當的時間和時間,則弱引用是垃圾收集,這就是為什么我在代碼中包含else語句以顯示這種情況的原因。 通過設置最小–Xms–Xmx來運行它,以了解其工作原理,因為否則您將不得不等待更長的時間才能獲得內存不足異常。 然后將WeakReference實現更改為SoftReference實現,并查看程序在幾次迭代后實際上崩潰了。 這是由于SoftReferences僅保證在發生OutOfMemory錯誤之前清理內存。 但是,有了WeakReference,該程序就可以繼續運行而不會暫停,因為它幾乎總是可以進行垃圾回收,并且我們可以重新初始化緩存并繼續填充緩存。

關于弱引用的好處是,在我看來,這是實現內存中緩存的最佳方法之一,當我們需要保留數據不經常更改但經常在內存中訪問且成本高昂時,通常會自行實現對于像JBoss緩存或EHCache這樣的成熟的緩存實現而言,這實在太多了。 通常,我已經實現了緩存解決方案,還看到了類似于以下代碼段的生產代碼。

import java.util.HashMap;  
import java.util.Map;  public class CacheTest {  private Map<String, Object> myAwesomeCache = new HashMap<String, Object>(100);  public Object getData(String id){  Object objToReturn = null;  if(myAwesomeCache.containsKey(id)){  objToReturn = myAwesomeCache.get(id);  }else{  // retrieve from the database and populate the in memory cache map  }  return objToReturn;  }  
}

這只是一個非常基本的級別的實現,它可以使我們有時會使用Maps來構建內存緩存實現。 我們必須注意的事實是,盡管此實現沒有本質上的錯誤,但是在您的應用程序內存不足的情況下,如果垃圾回收器可以將其從內存中刪除以釋放一些內存,這將是理想的選擇其他需要它的過程。 但是,由于此映射是一個強大的參考,因此垃圾回收器無法將此參考標記為符合收集條件。 更好的解決方案是將緩存實現從HashMap更改為WeakHashMap 。

Javadoc指定了有關WeakHashMap的以下內容;

“基于哈希表的具有弱鍵的Map實現。 如果WeakHashMap中的條目不再是普通使用的鍵,它將自動被刪除。 更準確地說,給定鍵的映射的存在不會阻止該鍵被垃圾收集器丟棄,即被終結化,終結和回收。 當一個鍵被丟棄時,它的條目會被有效地從映射中刪除,因此此類的行為與其他Map實現有所不同。”

因此,回想起來,我相信只要您需要內存中的緩存實現,并且內存對您而言至關重要,那么使用WeakHashMap將會是有益的。

總結了我對參考資料包的發現,并邀請大家分享您在這方面的經驗,對此深表感謝。

干杯

參考:在“ 我的旅程” IT博客中,從我們的JCG合作伙伴 Dinuka Arseculeratne 了解Java弱引用


翻譯自: https://www.javacodegeeks.com/2012/01/understanding-java-weak-references.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/373476.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/373476.shtml
英文地址,請注明出處:http://en.pswp.cn/news/373476.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

unbuntu 啟動任務腳本_Ubuntu下服務啟動腳本編寫

像Nginx、MySQL等服務一樣&#xff0c;在后臺運行自己編寫的抓取天氣信息的Python腳本。1.以管理員權限新建一個服務腳本文件sudo vim /etc/init.d/weather_service2.用下列模板修改該服務腳本文件#!/bin/bash### BEGIN INIT INFO## Provides: weather_service# Required-Start…

iOS開發工具——網絡封包分析工具Charles

作者 唐巧 發布于 2013年12月9日 | 1 討論 分享到&#xff1a;微博微信FacebookTwitter有道云筆記郵件分享稍后閱讀我的閱讀清單簡介 Charles是在Mac下常用的截取網絡封包的工具&#xff0c;在做iOS開發時&#xff0c;我們為了調試與服務器端的網絡通訊協議&#xff0c;常常需要…

Java Web托管選項流程圖

我經常被問到的一個問題是在何處以及如何托管Java Web應用程序。 可以在帶有嵌入式服務器的Eclipse中創建它很好&#xff0c;但是如何將它帶給人們呢&#xff1f; 長期以來&#xff0c;對于發燒友的程序員一直沒有答案。 只有昂貴和超大型的選擇。 事情最近變了&#xff0c;但這…

查找出系統中大于50k 且小于100k 的文件并刪除。

查找出系統中大于50k 且小于100k 的文件并刪除。 [rootxusx xxx]# ll -lhtotal 624K-rw-r--r-- 1 root root 576K Nov 30 21:39 1.txt-rw-r--r-- 1 root root 48K Nov 30 21:40 2.txt [rootxusx xxx]# find ./ -type f -size 1k -a -size -100k ./2.txt 轉載于:https://www.cnb…

vb.net mysql存儲圖片_怎么讓VB.NET 上傳圖片到SQL 數據庫只保存路徑,圖片保存到文件...

我的前臺代碼dimCoonAsSqlClient.SqlConnectiondimRsAsNewSqlClient.SqlCommandRs.ConnectionCoonRsNewSqlClient.SqlCommand("上傳圖片",Coon)Rs.CommandTypeCommandType.StoredPr...我的前臺代碼 dim Coon As SqlClient.SqlConnection dim Rs As New SqlClient.Sql…

[國嵌攻略][132][串口驅動實現]

如何開發Linux驅動程序 一般情況下都會有現成的驅動程序&#xff0c;不需要從零開始開發驅動程序。所以Linux驅動開發主要分為兩個步驟&#xff1a;1.讀得懂驅動程序&#xff1b;2.寫的了核心功能。 發送中斷處理程序 發送中斷處理函數在/drivers/serial/samsung.c的s3c24xx_se…

使用Regions ADF 11g進行Master Detail CRUD操作

你好 此示例演示了如何使用Regions在表之間創建Master Detail關系。 區域的主要目的是可重用性的概念。 使用區域和有限的任務流&#xff0c;我們可以將頁面重用到許多其他頁面中&#xff0c;以保持相同的功能并采用更簡潔的方法。 下載示例應用程序。 在此示例中&#xff0c;…

[轉] vim自定義配置 和 在ubnetu中安裝vim

Ubuntu 12.04安裝vim和配置 問題&#xff1a; ubuntu默認沒有安裝vim&#xff0c;出現&#xff1a; jygubuntu:~$ vim test.cThe program vim can be found in the following packages: * vim * vim-gnome * vim-tiny * vim-athena * vim-gtk * vim-noxTry: sudo apt-get insta…

win7 mysql php apache myadmin_windows下Apache+mysql+php+phpMyAdmin的安裝及配置 | 學步園

1、下載Apache ( httpd-2.2.25-win32-x86-no_ssl.msi )http://httpd.apache.org/download.cgi#apache24根據提示安裝到路徑(建議自定義路徑)&#xff0c;NetWork Domain和Server Name都輸入 localhost(訪問時使用的域名);2、下載mysql (mysql-5.5.34-win32.msi )http://dev.m…

(15) PHP 隨筆---LAMP Linux基本操作 對文件、目錄的操作

◇對目錄的操作&#xff1a; ◇創建目錄&#xff1a; mkdir Xmu //在當前目錄下創建一個名為Xmu的目錄 ◇創建多個級別目錄關系&#xff1a; mkdir -p newdir/newdir/newdir //在當前目錄下創建多個連續目錄&#xff0c;-p的意思是以遞歸的方式 ◇移動目錄(也可以針對…

具有NetBeans,嵌入式GlassFish,JPA和MySQL數據源的Arquillian

這是一個偶然的帖子。 我一直在研究交易CDI觀察者&#xff0c;并嘗試使用嵌入式GlassFish對它進行一些集成測試。 但是令人驚訝的是&#xff0c;這種方法不能很好地工作&#xff0c;我仍在弄清楚&#xff0c;使用普通的嵌入式GlassFish時問題出在哪里。 同時&#xff0c;我轉到…

hmcl手機版下載_最新HMCL下載地址

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓[16:49:27][AWT-EventQueue-0/ERROR]---- Hello Minecraft! Crash Report ----Version: 2.3.1Time: 2016-7-14Thread: Thread[AWT-EventQueue-0,6,main]Advice:無建議。Content:java.lang.IllegalStateException: Buffers have not…

為什么我會在2012年的新企業Java項目中使用Java EE而不是Spring

這個問題經常出現。 我的新項目也在2011年11月發布。 在這個新的Enterprise Java項目中&#xff0c;我將使用Java EE&#xff08;JEE&#xff09;代替Spring框架。 我知道&#xff1a;關于此主題的文章&#xff0c;博客和論壇討論都可以找到。 為什么還需要一個&#xff1f; 因…

jsp mysql 音樂網站_Maven+JSP+SSM+Mysql實現的音樂網站

項目簡介本系統基于MavenJSPSSMMysql實現的音樂網站。主要實現的功能有音樂播放、下載、上傳等幾個模塊。難度等級&#xff1a;中等技術棧編輯器Eclipse Version: 2020-03 (4.15.0)前端技術基礎&#xff1a;htmlcssJavaScript框架&#xff1a;JQueryBootstrap后端技術SpringSpr…

遙感影像濾波處理軟件 — timesat3.2

最近因為要做遙感影像的濾波處理&#xff0c;經過女神推薦&#xff0c;決定用Timesat&#xff0c;可是該軟件3.1版本只適合xp系統以及2011的matlab&#xff0c;后來在官網上找到了最新的3.2版本。支持64位操作系統以及2014的matlab。大家可以直接上官網&#xff08;http://www.…

持久化API(JPA)系列(三)實體Bean的開發技術-建立與數據庫的連接

在EJB 2.x中。EJB有3種類型的Bean。各自是會話Bean&#xff08;Session Bean&#xff09;、消息驅動Bean&#xff08;Message-Driven Bean&#xff09;和實體Bean&#xff08;Entity Bean&#xff09;。 隨著EJB 3的推出&#xff0c;EJB2.x中的實體Bean逐漸被JPA規范所替代&…

WebSphere Classloader內存泄漏預防

解決應用程序類加載器泄漏 應用領域 傾向于&#xff1a; 使用應用程序類加載器中的Runnable實現啟動新線程。 即使JEE編程模型不支持此功能&#xff0c;客戶也經常直接創建新線程或通過使用間接創建它們 計時器 客戶必須確保在停止相應的應用程序&#xff08;或WAR模塊&…

airflow sql_alchemy_conn mysql_airflow使用mysql數據庫,LocalExecutor并發調度

mysql-airflow在mysql上執行create database airflow; —— 創建數據庫GRANT all privileges on airflow.* TO airflow% IDENTIFIED BY 123456; —— 將數據庫airflow的所有權限授權airflow用戶&#xff0c;密碼123456且該用戶可在任何IP段登錄操作FLUSH PRIVILEGES; —— 刷新…

【SAP業務模式】之ICS(四):組織單元的配置

SAP的ICS業務后臺配置主要有以下幾個配置點&#xff1a; 1、組織單元的配置&#xff08;公司代碼、銷售組織、工廠、采購組織等&#xff09;&#xff1b; 2、主數據的部分&#xff1b; 3、訂單和開票的定價過程&#xff1b; 4、開票輸出類型&#xff1b; 5、公司間發票的配置&a…

poj-2478 Farey Sequence(dp,歐拉函數)

題目鏈接&#xff1a; Farey Sequence Time Limit: 1000MS Memory Limit: 65536KTotal Submissions: 14230 Accepted: 5624Description The Farey Sequence Fn for any integer n with n > 2 is the set of irreducible rational numbers a/b with 0 < a < b < n a…