了解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.mzph.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…