WeakHashMap

来源:http://hecc-cqut.iteye.com/blog/984235

在广大的Java界,关于WeakHashMap一直都存在这么个传说:



Java代码
在WeakHashMap 中,当某个键不再正常使用时,自动移除其条目

在WeakHashMap 中,当某个键不再正常使用时,将自动移除其条目 可是WeakHashMap是真的自动移除其条目吗?



今天因为闲来无事,所以想看看WeakHashMap是如何自动实现移除其内部不用的条目从而达到的自动释放内存的目的的。仔细的看了看JVM自带的源代码的实现,在WeakHashMap是主要通过expungeStaleEntries这个函数的来实现的。基本上只要对WeakHashMap的内容进行访问就会调用这个函数,从而达到清除其内部不在为外部引用的条目。但是如果预先生成了WeakHashMap,而在GC以前又不曾访问该WeakHashMap,那不是就不能释放内存了吗?



写个代码测试一把:

Java代码

public static void main(String[] args) throws Exception { List<WeakHashMap<byte[][], byte[][]>> maps = new ArrayList<WeakHashMap<byte[][], byte[][]>>(); for (int i = 0; i < 1000; i++) { 
WeakHashMap<byte[][], byte[][]> d = new WeakHashMap<byte[][], byte[][]>(); 
d.put(new byte[1000][1000], new byte[1000][1000]); 
maps.add(d); 
System.gc(); 
System.err.println(i); } } 
由于Java默认内存是64M,所以再不改变内存参数的情况下,该测试跑不了几步循环就内存溢出了。果不其然,WeakHashMap这个时候并没有自动帮我们释放不用的内存。


再加个对会对map进行访问的测试试试:

Java代码  

public static void main(String[] args) throws Exception {   List<WeakHashMap<byte[][], byte[][]>> maps = new ArrayList<WeakHashMap<byte[][], byte[][]>>();   for (int i = 0; i < 1000; i++) {   WeakHashMap<byte[][], byte[][]> d = new WeakHashMap<byte[][], byte[][]>();   d.put(new byte[1000][1000], new byte[1000][1000]);   maps.add(d);   System.gc();   System.err.println(i);   for (int j = 0; j < i; j++) {   System.err.println(j+  " size" + maps.get(j).size());   }   }   }  
这下测试就顺利通过了。



总结来说:WeakHashMap并不是你啥也干他就能自动释放内部不用的对象的,而是在你访问它的内容的时候释放内部不用的对象。这两句话看似区别不大,但是有时候一个小小的区别就会要了命的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/497939.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机视觉大规模爆发,6大细分领域将撑起725亿元市场

来源&#xff1a;中国经济时报概要&#xff1a;近几年来&#xff0c;随着技术的发展&#xff0c;中国计算机视觉行业发展迅速。近几年来&#xff0c;随着技术的发展&#xff0c;中国计算机视觉行业发展迅速。尤其是2016年下半年&#xff0c;1∶N人脸识别、视频结构化等计算机视…

java项目内存使用率过高排查_项目内存或者 cpu 占用率过高如何排查

前言:小编总结了之前生产环境cpu 占用率过高等问题,小编功力不够深厚,文章如有不对的地方,还望各位大神指正。排查原因&#xff1a;客服反馈说系统访问缓慢一、 在排查问题的过程中针对 CPU 的问题&#xff0c; 使用以下命令组合来排查问题模拟过程:①示例代码&#xff1a;pack…

java怎么自动提示关键词_Eclipse 实现关键字自动补全功能 (转)

一般默认情况下&#xff0c;Eclipse &#xff0c;MyEclipse 的代码提示功能是比Microsoft Visual Studio的差很多的&#xff0c;主要是Eclipse &#xff0c;MyEclipse本身有很多选项是默认关闭的&#xff0c;要开发者自己去手动配置。如果开发者不清楚的话&#xff0c;就不知道…

2017 人工智能+内容生产研究报告【附下载】

来源&#xff1a;亿欧概要&#xff1a;技术进步和产业内生需求&#xff0c;是推动AI开始在内容生产领域应用的两个主要动力。为了弄清AI内容生产进行到何种程度&#xff0c;对内容生产可能产生何种影响&#xff0c;小编撰写了这份《2017 人工智能内容生产研究报告》&#xff0c…

ThreadLocal与Synchronized的用法

来源&#xff1a;http://blog.csdn.net/wl_ldy/article/details/5948779 一.ThreadLocal的用法 ThreadLocal的实现&#xff1a; package com.sodao.lucene; import java.util.Random; public class ThreadLocalTest implements Runnable{ ThreadLocal<Studen…

java程序员面试需要注意什么_Java程序员面试时要注意的一些问题

Java程序员面试的时候会面临各种五花八门的问题&#xff0c;你的第一反应、思维逻辑、思考方法&#xff0c;专业水平决定了企业对你的评价和你的薪资水准&#xff0c;但是除了专业以外还有一些你需要避免出现错误的注意事项&#xff0c;如果很好的避免了&#xff0c;就能帮你在…

“强化学习之父”萨顿:预测学习马上要火,AI将帮我们理解人类意识

李杉 编译自 KDnuggets量子位 出品 | 公众号 QbitAI地处加拿大埃德蒙顿的阿尔伯塔大学&#xff08;UAlberta&#xff09;可谓是强化学习重镇&#xff0c;这项技术的缔造者之一萨顿&#xff08;Rich Sutton&#xff09;在这里任教。△ 萨顿萨顿常被称为“强化学习之父”&#xf…

cmd中java编译命令是什么_cmd中java的编译命令——java和javac、javap

如题&#xff0c;首先我们在桌面&#xff0c;开始->运行->键入cmd 回车&#xff0c;进入windows命令行。进入如图所示的画面&#xff1a;可知&#xff0c;当前默认目录为C盘Users文件夹下的Administrator文件夹。一般而言&#xff0c;我们习惯改变当前目录。由于windows有…

Struts2源码阅读(一)_Struts2框架流程概述

1. Struts2架构图 请求首先通过Filter chain&#xff0c;Filter主要包括ActionContextCleanUp&#xff0c;它主要清理当前线程的ActionContext和Dispatcher&#xff1b;FilterDispatcher主要通过AcionMapper来决定需要调用哪个Action。 ActionMapper取得了ActionMappi…

【Unity资源管理】任何导入资源的配套导入器AssetImporter

AssetImporter 类是什么呢&#xff1f; 当在Unity中导入资源&#xff08;比如图片、模型、音频等&#xff09;时&#xff0c;Unity会根据资源的类型创建相应的AssetImporter&#xff01; 在Unity中&#xff0c;每个导入的资源都会有一个相应的AssetImporter与之对应。当你将资…

如何衡量机器与人类的智能关系,AI智商评测标准专家研讨会邀请

21世纪以来&#xff0c;人工智能领域陆续爆发很多重要事件。其中最吸引人们眼球的&#xff0c;当属2016年战胜了人类围棋冠军并开始能够从0自我学习的AlphaGo。10月26日&#xff0c;软银CEO孙正义在沙特阿拉伯举行的未来投资计划大会上称&#xff0c;未来30年内AI的智商&#x…

java测试一个泰勒级数_自己 推导一个 泰勒级数

一开始 的 时候&#xff0c; 以为 泰勒级数 是 f ( x ) 和 n 阶导数 之间 的 关系&#xff0c; 或者 f ( x ) 的 1 阶导数 和 2 阶 、3 阶 …… n 阶导数 之间 的 关系 &#xff0c; 作了 一些 这样 的 推导 &#xff1a;f ′ ( x ) [ f ( x ⊿ x ) - f ( …

谷歌Jeff Dean团队发文,探讨「学习模型」如何替代传统索引结构

原文来源&#xff1a;arxiv-vanity作者&#xff1a;Tim Kraska、Alex Beutel、Ed H. Chi、Jeffrey Dean、Neoklis Polyzotis「雷克世界」编译&#xff1a;嗯~阿童木呀、多啦A亮、我是卡布达索引就是模型&#xff1a;B-Tree-Index可以看作是一个能够将一个键映射到排序数组中记录…

Struts2源码阅读(二)_ActionContext及CleanUP Filter

1. ActionContext ActionContext是被存放在当前线程中的&#xff0c;获取ActionContext也是从ThreadLocal中获取的。所以在执行拦截器、 action和result的过程中&#xff0c;由于他们都是在一个线程中按照顺序执行的&#xff0c;所以可以可以在任意时候在ThreadLocal中获取 Act…

php html区别_php与html区别

php与html区别HTML是超文本标记语言&#xff1b;PHP即“超文本预处理器”&#xff0c;是一种通用开源脚本语言。PHP 独特的语法混合了 C、Java、Perl 以及 PHP 自创新的语法。HTML主要用在客户端的显示&#xff0c;比如我们浏览的网页&#xff0c;特别是静态网页&#xff0c;都…

Struts2源码阅读(三)_DispatcherConfigurationProvider

首先强调一下struts2的线程程安全&#xff0c;在Struts2中大量采用ThreadLocal线程局部变量的方法来保证线程的安全,像Dispatcher等都是通过ThreadLocal来保存变量值,使得每个线程都有自己独立的实例变量,互不相干. 接下来就从Dispatcher开始看起&#xff0c;先看其构造函数&a…

php点击链接代码,php 获取超链接中文本的代码

本文分享的这段代码&#xff0c;使用php正则从超链接中提取文本。例如&#xff0c;可以从Link中&#xff0c;获取文本内容&#xff1a;Link。代码如下&#xff1a;/*** 从超链接中提取文本* param string $url* return string* edit www.jbxue.com*/function getUrlLinkText($u…

谷歌宣布在北京成立AI中国中心:李飞飞和李佳共同领导

来源&#xff1a;澎湃新闻概要&#xff1a;谷歌正式宣布谷歌AI中国中心&#xff08;Google AI China Center&#xff09;在北京成立。谷歌正式宣布谷歌AI中国中心&#xff08;Google AI China Center&#xff09;在北京成立。12月13日&#xff0c;在上海举行的谷歌开发者大会&a…

2008php多版本共存,ECS Windows 2008 IIS如何同时配置多版本的php

ECS Windows 2008 IIS如何同时配置多版本的phpWindows可以通过IIS下安装PHP Manager工具让IIS可以同时支持多版本的php&#xff0c;具体步骤如下所示&#xff1a;1.首先需要下载PHP Manager软件(下载地址&#xff1a;http://phpmanager.codeplex.com/releases/view/69115)&…

Struts2源码阅读(四)_DispatcherConfigurationProvider续

接下来第三步:init_LegacyStrutsProperties()调用的是调用的是LegacyPropertiesConfigurationProvider通过比较前面DefaultPropertiesProvider与调用的是LegacyPropertiesConfigurationProvider.发现DefaultPropertiesProvider继承自后者,但重写了register()方法,主要是生成Pro…