- 浏览: 2663240 次
- 来自: 杭州
文章分类
- 全部博客 (1188)
- webwork (4)
- 网摘 (18)
- java (103)
- hibernate (1)
- Linux (85)
- 职业发展 (1)
- activeMQ (2)
- netty (14)
- svn (1)
- webx3 (12)
- mysql (81)
- css (1)
- HTML (6)
- apache (3)
- 测试 (2)
- javascript (1)
- 储存 (1)
- jvm (5)
- code (13)
- 多线程 (12)
- Spring (18)
- webxs (2)
- python (119)
- duitang (0)
- mongo (3)
- nosql (4)
- tomcat (4)
- memcached (20)
- 算法 (28)
- django (28)
- shell (1)
- 工作总结 (5)
- solr (42)
- beansdb (6)
- nginx (3)
- 性能 (30)
- 数据推荐 (1)
- maven (8)
- tonado (1)
- uwsgi (5)
- hessian (4)
- ibatis (3)
- Security (2)
- HTPP (1)
- gevent (6)
- 读书笔记 (1)
- Maxent (2)
- mogo (0)
- thread (3)
- 架构 (5)
- NIO (5)
- 正则 (1)
- lucene (5)
- feed (4)
- redis (17)
- TCP (6)
- test (0)
- python,code (1)
- PIL (3)
- guava (2)
- jython (4)
- httpclient (2)
- cache (3)
- signal (1)
- dubbo (7)
- HTTP (4)
- json (3)
- java socket (1)
- io (2)
- socket (22)
- hash (2)
- Cassandra (1)
- 分布式文件系统 (5)
- Dynamo (2)
- gc (8)
- scp (1)
- rsync (1)
- mecached (0)
- mongoDB (29)
- Thrift (1)
- scribe (2)
- 服务化 (3)
- 问题 (83)
- mat (1)
- classloader (2)
- javaBean (1)
- 文档集合 (27)
- 消息队列 (3)
- nginx,文档集合 (1)
- dboss (12)
- libevent (1)
- 读书 (0)
- 数学 (3)
- 流程 (0)
- HBase (34)
- 自动化测试 (1)
- ubuntu (2)
- 并发 (1)
- sping (1)
- 图形 (1)
- freemarker (1)
- jdbc (3)
- dbcp (0)
- sharding (1)
- 性能测试 (1)
- 设计模式 (2)
- unicode (1)
- OceanBase (3)
- jmagick (1)
- gunicorn (1)
- url (1)
- form (1)
- 安全 (2)
- nlp (8)
- libmemcached (1)
- 规则引擎 (1)
- awk (2)
- 服务器 (1)
- snmpd (1)
- btrace (1)
- 代码 (1)
- cygwin (1)
- mahout (3)
- 电子书 (1)
- 机器学习 (5)
- 数据挖掘 (1)
- nltk (6)
- pool (1)
- log4j (2)
- 总结 (11)
- c++ (1)
- java源代码 (1)
- ocr (1)
- 基础算法 (3)
- SA (1)
- 笔记 (1)
- ml (4)
- zokeeper (0)
- jms (1)
- zookeeper (5)
- zkclient (1)
- hadoop (13)
- mq (2)
- git (9)
- 问题,io (1)
- storm (11)
- zk (1)
- 性能优化 (2)
- example (1)
- tmux (1)
- 环境 (2)
- kyro (1)
- 日志系统 (3)
- hdfs (2)
- python_socket (2)
- date (2)
- elasticsearch (1)
- jetty (1)
- 树 (1)
- 汽车 (1)
- mdrill (1)
- 车 (1)
- 日志 (1)
- web (1)
- 编译原理 (1)
- 信息检索 (1)
- 性能,linux (1)
- spam (1)
- 序列化 (1)
- fabric (2)
- guice (1)
- disruptor (1)
- executor (1)
- logback (2)
- 开源 (1)
- 设计 (1)
- 监控 (3)
- english (1)
- 问题记录 (1)
- Bitmap (1)
- 云计算 (1)
- 问题排查 (1)
- highchat (1)
- mac (3)
- docker (1)
- jdk (1)
- 表达式 (1)
- 网络 (1)
- 时间管理 (1)
- 时间序列 (1)
- OLAP (1)
- Big Table (0)
- sql (1)
- kafka (1)
- md5 (1)
- springboot (1)
- spring security (1)
- Spring Boot (3)
- mybatis (1)
- java8 (1)
- 分布式事务 (1)
- 限流 (1)
- Shadowsocks (0)
- 2018 (1)
- 服务治理 (1)
- 设计原则 (1)
- log (0)
- perftools (1)
最新评论
-
siphlina:
课程——基于Python数据分析与机器学习案例实战教程分享网盘 ...
Python机器学习库 -
san_yun:
leibnitz 写道hi,我想知道,无论在92还是94版本, ...
hbase的行锁与多版本并发控制(MVCC) -
leibnitz:
hi,我想知道,无论在92还是94版本,更新时(如Puts)都 ...
hbase的行锁与多版本并发控制(MVCC) -
107x:
不错,谢谢!
Latent Semantic Analysis(LSA/ LSI)算法简介 -
107x:
不错,谢谢!
Python机器学习库
理解StrongReference,SoftReference, WeakReference的区别(http://san-yun.iteye.com/blog/1683558)文中解释了各种Reference。 Reference都有构造函数可以传入ReferenceQueue来监听GC对referent的处理,构造函数如下:
下面是一段测试代码:
分析,在GC运行时,检测到new A()生成的对象只有一个WeakReference引用着,所以决定回收它,首先clear WeakReference的referent,然后referent的状态为finalizable,同时或者一段时间后把WeakReference放入监听的ReferenceQueue中。
注意有时候最后的Assert.assertNotNull(obj);有时会失败,因为还没有来的及把WeakReference放入监听的ReferenceQueue中。
下面是一个可自动回收的map实现:
参考:http://zhang-xzhi-xjtu.iteye.com/blog/413159
Reference(T referent, ReferenceQueue<? super T> queue) { this.referent = referent; this.queue = (queue == null) ? ReferenceQueue.NULL : queue; }
下面是一段测试代码:
public class A { } ReferenceQueue queue = new ReferenceQueue(); WeakReference ref = new WeakReference(new A(), queue); Assert.assertNotNull(ref.get()); Object obj = null; obj = queue.poll(); Assert.assertNull(obj); System.gc(); Assert.assertNull(ref.get()); obj = queue.poll(); Assert.assertNotNull(obj);
分析,在GC运行时,检测到new A()生成的对象只有一个WeakReference引用着,所以决定回收它,首先clear WeakReference的referent,然后referent的状态为finalizable,同时或者一段时间后把WeakReference放入监听的ReferenceQueue中。
注意有时候最后的Assert.assertNotNull(obj);有时会失败,因为还没有来的及把WeakReference放入监听的ReferenceQueue中。
下面是一个可自动回收的map实现:
import java.lang.ref.ReferenceQueue; import java.lang.ref.WeakReference; import java.util.HashMap; import java.util.Map; public class WeakIdentityMap { private transient ReferenceQueue<Object> idKeys = new ReferenceQueue<Object>(); private Map<WeakIdKey, Object> objHashcodeToPyId = new HashMap<WeakIdKey, Object>(); @SuppressWarnings("element-type-mismatch") private void cleanup() { Object k; while ((k = idKeys.poll()) != null) { System.out.println("cleanup"); objHashcodeToPyId.remove(k); } } private class WeakIdKey extends WeakReference<Object> { private final int hashcode; WeakIdKey(Object obj) { super(obj, idKeys); hashcode = System.identityHashCode(obj); } @Override public int hashCode() { return hashcode; } @Override public boolean equals(Object other) { Object obj = get(); if (obj != null) { return obj == ((WeakIdKey) other).get(); } else { return this == other; } } } // Used by test_jy_internals public int _internal_map_size() { return objHashcodeToPyId.size(); } public void put(Object key, Object val) { cleanup(); objHashcodeToPyId.put(new WeakIdKey(key), val); } public Object get(Object key) { cleanup(); return objHashcodeToPyId.get(new WeakIdKey(key)); } public void remove(Object key) { cleanup(); objHashcodeToPyId.remove(new WeakIdKey(key)); } public static void main(String[] args) throws InterruptedException { WeakIdentityMap map = new WeakIdentityMap(); map.put("1", "a"); map.put(new Object(), "b"); map.put(new Object(), "2"); System.gc(); Thread.sleep(1000); map.put("1", "a"); } }
参考:http://zhang-xzhi-xjtu.iteye.com/blog/413159
发表评论
-
Raft
2018-07-12 14:20 762前言 上篇文章说解决问题要分而治之,先把分片的问题解决了再 ... -
java uuid
2017-09-14 18:18 560在java中产生uuid的方式是使用java.util.UU ... -
JAVA 编码规范
2017-09-06 11:34 414https://google.github.io/style ... -
mac 入门
2015-12-01 16:28 626http://foocoder.com/blog/wo-zai ... -
java 反编译工具gad
2014-05-09 12:04 977java 反编译工具gad,备个份。 -
java 代码大全(code book)
2014-04-29 10:59 1083参考这里: http://www.java2s.com/C ... -
SQL语法解析器JSQLParser
2014-02-09 19:53 2150SQL 语法解释器jsqlparser 是用java ... -
BufferedInputStream 深入研究。
2013-11-19 13:26 14271. BufferedInputStream的基本原理 ... -
java 启动脚本
2013-08-22 19:08 982java 启动脚本 #!/bin/bash cmd=&q ... -
CRLF escape
2013-08-06 17:51 1200最近需要对用户输入的CRLF即(\r\n)做escape, ... -
安全的自增类
2013-07-22 18:16 991java中一个计数器如果超过MAX_VALUE再自增会如何? ... -
solr日志被block的问题
2013-05-23 16:48 1265"catalina-exec-22386" ... -
beanMapper
2013-01-13 22:43 889实在被一堆get,set搞烦了,周末写了一个beanMappe ... -
java instanceof ,isInstance(),isAssignableFrom之前的差异
2013-01-06 11:00 962public class ItemQuery { ... -
通过gzip对字符串压缩
2012-12-22 18:10 3128通过GZIPOutputStream,GZIPInputStr ... -
关于URL编码
2012-12-21 14:18 1112一、问题的由来 URL就是网址,只要上网,就一定会用到。 ... -
Concurrent LRUCache
2012-12-10 15:24 2115最近要为cat增为加一个top key统计,为了避免内存爆掉, ... -
spring的FactoryBean机制
2012-11-20 16:18 1240spring可以通过的FactoryBean的形式把一个Fac ... -
HashMap cpu占用 100%
2012-11-10 22:22 1815今天在重现出HashMap cpu占用100%了,只 ... -
文字扫描工具--java.util.Scanner
2012-11-10 14:33 1102A simple text scanner which c ...
相关推荐
WeakHashMap是弱引用map,就是Key键是一个弱引用的键,如果Key键被回收,则在get该map中值后,会自动remove掉value。如果Key键始终被强引用,则是无法被回收的;注意Value是被强引用的,所以不要让Value间接的引用了...
WeakHashMap的实现原理是使用WeakReference来保存键和值,WeakReference是一个弱引用的实现,它可以在垃圾回收器清理对象时自动清理对象的引用。在WeakHashMap中,每个键和值都是WeakReference对象,这样可以使得...
在Java中,`java.util.concurrent`包提供了线程池的相关实现,如`ThreadPoolExecutor`。`ThreadPoolExecutor`类的构造函数接受多个参数,其中包括核心线程数、最大线程数、线程空闲时间、线程存活时间单位以及工作...
在Java中,垃圾收集(Garbage Collection, GC)机制自动管理内存资源,有效地解决了手动管理内存时可能遇到的问题,如内存泄漏等。然而,在某些情况下,我们希望某些对象能尽可能长时间地存活在内存中,而不被GC回收...
例如,如果你希望在内存不足时自动清理缓存,可以使用软引用;如果希望对象在任何情况下都能被回收,可以选择弱引用;而虚引用则常用于在对象被回收前执行某些清理工作。理解并正确使用这些引用类型,对于编写高效、...
例如,在缓存系统中,使用软引用可以实现自动释放资源的缓存策略,当内存紧张时,不再使用的缓存项会被自动回收。而弱引用则常用于避免内存泄漏,确保对象在不再被程序其他部分引用时能被及时清理。 在Java开发中,...
这在实现一些缓存机制时非常有用,例如,在内存充足时缓存对象,在内存紧张时自动释放这些对象。 接下来是软引用(SoftReference)。软引用是一种比弱引用更强的引用,只有在JVM认为内存不足的情况下,才会回收被软...
Reference和ReferenceQueue可以实现对象的软引用、弱引用和虚引用,用于内存管理。 总的来说,Java的基础知识体系广泛且深入,涵盖了从基本语法、输入输出、集合框架到高级特性的方方面面,对于开发者来说,理解和...
引用队列(ReferenceQueue)是与引用类型配合使用的工具,当弱引用或虚引用的对象被垃圾收集后,它们会自动加入到引用队列,方便程序进行后续的清理工作。 总结来说,Java的引用类型提供了一种控制对象生命周期的...
Java中的`finalize`方法是Object类的一个特殊方法,它的主要作用是在对象被垃圾收集器回收前执行清理工作。本文将详细解析`finalize`方法的实现和执行过程。 首先,了解`finalize`方法的用途:当一个对象不再被任何...
软引用(SoftReference)用于缓存临时数据,其引用的对象被回收后,SoftReference对象本身不会自动清理,需要一个清除机制来避免内存泄露。当软引用对象被垃圾回收器回收后,SoftReference对象会被放入到...
Java的垃圾收集机制自动处理不再使用的对象,以便有效地利用系统资源。然而,为了更好地控制内存,Java提供了不同类型的引用:强引用、弱引用、软引用和虚引用。这些引用类型允许程序员在特定场景下干预垃圾收集过程...
- **虚引用(Phantom References)**:几乎任何时候都可以被回收,通常与`ReferenceQueue`结合使用,管理与对象关联的本地资源清理,而不依赖于`finalize()`方法。 了解这些引用类型的行为对于有效地管理Java程序的...
通过创建一个`SoftReference<Bitmap>`实例并将Bitmap对象保存在`HashMap`中,我们可以在需要时快速访问图片,而当内存紧张时,软引用的对象会被自动清理,防止内存溢出。 软引用可以与`ReferenceQueue`一起使用,当...
虚引用必须与引用队列(ReferenceQueue)配合使用,当对象被回收时,虚引用会被放入队列,这样开发者可以通过队列知道何时可以安全地进行资源释放。 总结来说,这四种引用类型在内存管理中各有其用处。强引用保证...
在Java中,`Reference`类是一个特殊...在实际编程中,选择合适的引用类型取决于应用场景,例如,使用 `WeakHashMap` 可以在对象不再被强引用时自动移除,而 `PhantomReference` 则用于在对象被彻底回收后执行清理工作。
虚引用主要用于实现对象的“finalize”机制,即在对象被垃圾回收前执行一些清理工作,如关闭文件等。当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象之前,把这个虚引用加入到与之关联的队列...
在实际应用中,我们可以利用引用队列来实现资源的自动管理。例如,当一个对象不再需要某个资源时,可以使用虚引用(`PhantomReference`)来追踪这个对象。由于虚引用在对象被终结(finalization)后才加入队列,因此...
- **资源清理**:虚引用配合引用队列可以实现对象回收后的资源清理,例如关闭文件流或其他资源。 理解并正确使用这些引用类型是优化Java应用程序性能和内存管理的关键。在设计内存敏感的系统时,合理选择引用类型能...
只有在内存不足时,软引用对象才会被清理,以防止`OutOfMemoryError`的发生。 - 示例:`SoftReference<String> softRef = new SoftReference(new String("Hello"));` 3. **弱引用(Weak Reference)** - 弱引用比...