- 浏览: 53116 次
文章分类
最新评论
昨天在我们的系统中看到了这样的一行代码:
对于
1. 强引用、软引用、弱引用、虚引用
1)强引用:就是我们平时写的new了,如Object o = new Object(),这里有两点请注意,一个是o,另一个是Object。这里假设这行代码是在方法体里写的(局部和全局是有相当大的区别的),那么o就是存储在栈空间里,而Object对象是存储在堆空间里,o就是Object对象的引用了。如果o的生命周期一直存在,那么Object对象是一直不会被回收的,即使空间不足了,它也不会回收,宁愿抛出 OutOfMemery的异常。现在是写在方法体里了,当调用这个方法结束时,o的生命周期就结束了,此时Ojbect对象就没有引用了,垃圾回收器就会将它进行回收,具体在什么时候回收,我们就不得而知了。
2)软引用:它的特征是空间足够,不会回收,空间不足够,就会回收。垃圾回收器在回收之前做了一个操作,就是将其引用置为null了。
3)弱引用:它的特征是不管空间是否足够,它都有可能被会垃圾回收器回收。
4)虚引用:它本质是在垃圾回收后进行一定的辅助操作,它不涉及对象的生命周期。
2.WeakHashMap
WeakHashMap,从字面上看,就知道,它是一个弱引用,它其实也是一个Map,不过它有一个特征就是:当key的对象不可用时,它的key-value就会被回收。这里的不可用,是什么意思呢?就是这个key的对象是非强引用时,它就会变成不可用。下面会给出相应的例子来讲解。
请注意:
1)如果将 1),2)注释掉,则输出的结果为null;
2)如果将3)注释掉,1) 2) 打开则输出的结果为key的value值。
怎么是这样的呢?这是因为
private final Map<String, String> CACHE = new WeakHashMap();
对于
WeakHashMap而言,之前还真的没有听过, 惭愧啊!晚上就好好的研究了下,这个不对不说说强引用、软引用、弱引用、虚引用以及垃圾回收了。
1. 强引用、软引用、弱引用、虚引用
1)强引用:就是我们平时写的new了,如Object o = new Object(),这里有两点请注意,一个是o,另一个是Object。这里假设这行代码是在方法体里写的(局部和全局是有相当大的区别的),那么o就是存储在栈空间里,而Object对象是存储在堆空间里,o就是Object对象的引用了。如果o的生命周期一直存在,那么Object对象是一直不会被回收的,即使空间不足了,它也不会回收,宁愿抛出 OutOfMemery的异常。现在是写在方法体里了,当调用这个方法结束时,o的生命周期就结束了,此时Ojbect对象就没有引用了,垃圾回收器就会将它进行回收,具体在什么时候回收,我们就不得而知了。
2)软引用:它的特征是空间足够,不会回收,空间不足够,就会回收。垃圾回收器在回收之前做了一个操作,就是将其引用置为null了。
3)弱引用:它的特征是不管空间是否足够,它都有可能被会垃圾回收器回收。
4)虚引用:它本质是在垃圾回收后进行一定的辅助操作,它不涉及对象的生命周期。
2.WeakHashMap
WeakHashMap,从字面上看,就知道,它是一个弱引用,它其实也是一个Map,不过它有一个特征就是:当key的对象不可用时,它的key-value就会被回收。这里的不可用,是什么意思呢?就是这个key的对象是非强引用时,它就会变成不可用。下面会给出相应的例子来讲解。
public static void main(String args[]) throws ClassNotFoundException, SQLException, InterruptedException { Map<String, String> cache = new WeakHashMap(); String key=null; try(Connection connection = DBConnection.getConnection()){ try (PreparedStatement pstmt = connection .prepareStatement("SELECT F01,F02 FROM Table LIMIT 1")) { try (ResultSet resultSet = pstmt.executeQuery()) { if (resultSet.next()) { System.out.println("F01 = " +resultSet.getString(1)); // key=resultSet.getString(1); // --(1) // cache.put(key, resultSet.getString(2)); // --(2) cache.put(resultSet.getString(1),resultSet.getString(2)); // --(3) } } } } while(true){ System.gc(); Thread.sleep(50000); System.out.println("get value:"+cache.get("BAOFUPAY.BF_CHARGE_PAGEURL")); } }
请注意:
1)如果将 1),2)注释掉,则输出的结果为null;
2)如果将3)注释掉,1) 2) 打开则输出的结果为key的value值。
怎么是这样的呢?这是因为
resultSet.getString(1),它是匿名对象,是没有引用的,这个key很快就会变成不可用,如果有一个key的变量,如上面所写,
key=resultSet.getString(1),它就变成了一个强引用了,此时就不可能被回收了。
发表评论
-
Java IO 读文件的各种方法总结
2016-01-01 15:00 697IO分为字节流和字符流,字符就是简单的字符串存储,从理伦上讲, ... -
动态代理的应用
2015-12-22 17:30 733代理模式作为开发人员 ... -
Java Restful
2015-12-19 14:01 440对于两个系统之间交互信息,有两种常见的方式:webservic ... -
request.getInputStream() 只能读一次的解决方法
2015-12-17 12:17 2380我们知道request.getInputStream()只能读 ... -
java Hessian 版本冲突问题解决方法
2015-12-11 19:44 883今天在实际的项目发现了一个问题就是hessian的版本不兼容的 ... -
ThreadPoolExecutor参数讲解
2015-12-10 08:14 8181. 线程池可以节省创建多个线程带来的开销问题。 2. 线程 ... -
Java RSA 加密 解密 签名 验签
2015-12-09 10:01 61511. 加密的作用 1)明文变密文(你不知道密钥是很难解密的) ... -
Java Xstream xml 与bean之间的转换
2015-12-09 08:31 747xml文件如下: <mvc> & ... -
XPATH 解析XML
2015-12-09 08:28 4351. 表达式描述 nodename 选取此节点的所有子节 ... -
Java Dom4j 解析XML
2015-12-09 08:23 366Dom4j和JDom是很相似的,用起来十分方便。 XML文件 ... -
Java JDom 解析xml
2015-12-09 08:22 420JDOM在解析XML在代码量之上比之前的方法(DOM和SAX要 ... -
Java SAX 解析xml
2015-12-08 18:13 423在上一篇中http://gaofulai1988.iteye. ... -
Java XML解析系列
2015-12-08 18:00 765Java解析XML有多种方式,因此需要分为几个不同的系列来讲。 ... -
Java 背包算法计算从数组中找若干个数使其最接近某个数
2015-12-08 17:38 1991背包的算法的动态方式如下: f(i,w) = max{ f(i ... -
C3P0 连接分析
2015-12-01 19:05 895最近在看C3P0的原理,还是将C3P0的源码导入到Ecplis ... -
微信开发的原理
2015-11-30 10:10 1318微信在现在的生活中,扮演着举足轻重的角色,现在怎么东西都在微信 ... -
JAVA Timestamp 与Data的转化以及BigDecimal 保留两位小数
2015-11-27 14:47 17121. BigDecimal 保留两位小数 今天在项目中遇到这 ... -
java try catch finally return 继续
2015-11-27 13:45 403之前在博客中有一篇文章讨论过异常中return值的情况,有兴趣 ... -
Java JDBC executeBatch 批量操作
2015-11-27 08:05 1634对JDBC 的 CRUD操作,我相信对于每个开发人员来讲,是十 ... -
加密与解密
2015-11-18 18:12 482我本身不是学密码出身的,但在工作中经常要使用加密与解密的东东, ...
相关推荐
3. **散列映射视图**:提供键值对形式的数据,帮助分析集合类如HashMap或WeakHashMap的内存占用情况。 4. ** Leak Suspects 报告**:MAT会自动分析dump文件并生成报告,列出可能导致内存泄漏的嫌疑人,包括无法释放...
以下是对这些数据结构及其在Java中的具体实现的详细分析: 1. **线性表**: - **ArrayList**: 作为线性表的一种实现,ArrayList是一个动态数组,它允许快速的随机访问(O(1)时间复杂度)。通过索引可以快速获取...
本课件集合主要针对Java中的数据结构及其算法进行了深入的探讨和分析。 在"java数据结构课件与分析"中,我们可以期待学习到以下几个关键的知识点: 1. **数组**:Java中的基础数据结构,用于存储固定数量的相同...
《Java 理论与实践: 用弱引用堵住内存泄漏》一文也指出了使用全局的Map作为缓存容器时发生的内存泄露问题,介绍了如何使用hprof工具来找出内存泄露,并分析了如何使用弱引用来防止内存泄露,还分析了
可以使用 Java 的 API 来实现对象的缓存,例如使用 WeakHashMap 来实现缓存。 7. profiling 工具的使用 profiling 工具是优化 Java 进程的内存占用的一种重要方法。例如,可以使用 VisualVM、JProfiler 等 ...
通过以上分析,我们可以看出,这个“简易人员管理系统(纯Java版)”不仅涵盖了Java编程的基础知识,还涉及到软件设计的多个层面,包括用户交互、数据管理、性能优化以及安全性控制。对于学习和理解Java开发有很好的...
Java的集合框架包括List(如ArrayList、LinkedList和Vector)、Set(如HashSet、TreeSet、LinkedHashSet和PriorityQueue)、Map(如HashMap、TreeMap、LinkedHashMap、Hashtable、IdentityHashMap、WeakHashMap)...
在Java编程中,WeakHashMap是一种特殊的哈希表,它的键(Key)是弱引用,当键被垃圾回收器清除后,即使有值(Value)存在,该条目也会自动从哈希表中移除。 线程死锁的原因通常包括以下几点: 1. **资源互斥**:每...
### Java避免内存泄露的关键知识点 ...通过以上分析,我们可以了解到在Java中避免内存泄露的一些关键策略和技术要点。正确地管理资源和引用,不仅可以提升程序的健壮性,还能提高系统的整体性能。
PPT可能涵盖了这些接口的详细特性,包括它们的实现类、操作方法、性能分析,以及如何根据实际需求选择合适的集合类型。此外,还可能讲解到泛型、迭代器、并发集合(如ConcurrentHashMap)等内容,这些都是Java集合...
7.6.3 WeakHashMap实现类 279 7.6.4 IdentityHashMap实现类 280 7.6.5 EnumMap实现类 281 7.7 HashSet和HashMap的性能选项 282 7.8 操作集合的工具类:Collections 283 7.8.1 排序操作 283 7.8.2 查找,替换...
这些知识点仅仅是Java容器对象的一部分,实际的博客可能会包含更多细节,如源码分析、性能对比和最佳实践。通过阅读博客中的`持有对象.xmind`文件,可以进一步了解博主对这些概念的详细整理和分类。如果你对Java容器...
3. 内存分析:分析内存泄露、对象生命周期和内存消耗,帮助优化代码和配置。 五、其他高级特性 1. 泛型:提供类型安全的集合,避免强制类型转换。 2. 异常处理:try-catch-finally结构,用于捕获和处理异常。 3. ...
6. **监控与分析**:使用工具如VisualVM、JProfiler、YourKit等进行性能监控,分析CPU、内存、线程等状况,找出性能瓶颈。日志和Profiling可以帮助定位问题,而AOP(面向切面编程)可以用于记录方法执行时间,便于...
- **Jconsole/VisualVM/jps/jstat/jstack/jmap/jhat/jmeter**:这些工具可以帮助监控和分析应用程序的性能。 #### 十一、Java Web开发 Java Web开发涵盖了从架构设计到具体技术实现的多个方面: - **MVC**:模型-...
本文将从字符串处理、数组、集合、Key/Value存储、多线程同步、文件操作和目录操作等方面对Delphi和Java的差异进行比较和分析。 1. 字符串处理 在Delphi中,字符串处理使用var关键字声明的字符串变量,例如:`var...
在本文中,我们将全面分析Java集合框架的核心概念和实现细节。 首先,Java集合框架的基础是`Collection`接口,它是所有集合类的根接口,定义了集合的基本操作。`Collection`接口有两个重要的子接口:`List`和`Set`...
- **垃圾回收(GC)**:理解Java的自动内存管理机制,知道如何分析和优化GC性能。 2. **类与对象** - **构造器**:了解构造器的作用,掌握构造器的重载和实例化过程。 - **访问修饰符**:理解public、private、...
工具如VisualVM或JProfiler可以帮助开发者监控和分析Java应用的内存状态,更好地理解引用类型的作用。 通过阅读“java 引用相关文档”,开发者可以深入理解Java引用机制,提升对内存管理的掌控能力,从而编写出更加...
根据给定的文件信息,以下是对“Java面试题集锦”中的关键知识点的详细解析: ...通过以上分析,我们可以看到Java面试题集锦覆盖了从基础概念到高级特性的广泛知识点,对准备Java面试的人来说是非常宝贵的资源。