一直很想知道WeakHashMap的使用场景,想来想去只能用在高速缓存中,而且缓存的数据还不是特别重要,因为key(key不存在被引用的时候)随时会被回收

所以研究了一下WeakHashMap的回收时机

呵呵,现在可以重视 String str = "abc" 跟 String Str = new String("abc") 的区别了,因为涉及到收回问题

String str = "abc" //这属于编译时生成的字面量,会放入运行时常量池,这个区域的收回条件非常苛刻,所以一般不会被回收,所以哪怕不存在引用,WeakHashMap的这个key也不容易被回收

String Str = new String("abc") //会放入堆内存,GC着重处理这个区

/*** * @author ZhenWeiLai**/
public class TestWeakHashMap {static WeakHashMap<String,String> map = new WeakHashMap<>();//会被回收因为 map 的 key 用 new String 实例化了一个对象 保存在堆里,虽然是线程共享,但是并没有任何引用指向这个key/*** 这里补充一下,Java heap 是被所有线程共享的一块内存区域* 几乎所有的对象实例都在这里分配内存,这里说几乎,是因为随着JIT编译器的发展与逃逸分析技术逐渐成熟* 栈上分配,标量替换等优化技术将导致一些微妙的变化发生,所有的对象都分配在堆上也渐渐变得不是那么绝对*/static {map.put(new String("a"),new String("abc"));map.put(new String("b"),new String("abc"));map.put(new String("c"),new String("abc"));map.put(new String("d"),new String("abc"));map.put(new String("e"),new String("abc"));map.put(new String("f"),new String("abc"));map.put(new String("g"),new String("abc"));}//会被回收static WeakHashMap<String,String> map4 = new WeakHashMap<>();static {map4.put(new String("a"),"abc");map4.put(new String("b"),"abc");map4.put(new String("c"),"abc");map4.put(new String("d"),"abc");map4.put(new String("e"),"abc");map4.put(new String("f"),"abc");map4.put(new String("g"),"abc");}static WeakHashMap<String,String> map2 = new WeakHashMap<>();//不会被收回,因为存在 方法区(以前也叫永久代,JAVA8已经不存在永久代) - 常量池/*** (Method Area 别名 Non-Heap) 与Java Heap 一样,是各个线程共享的内存区域,* 以前这个区域也叫作 永久代,因为几乎不会被回收* 它用于存储已被虚拟机加载的类信息,常量,静态变量.即时编译后的代码等数据*//*** map2的key 是存在 运行时常量池,运行时常量池是 Method Area的一部分* Java并不要求常量一定只有在编译期才能产生,运行期间也可能将新的常量放入池中,具有代表性的就是String的intern()方法*/static {map2.put("a","abc");map2.put("b","abc");map2.put("c","abc");map2.put("d","abc");map2.put("e","abc");map2.put("f","abc");map2.put("g","abc");}public static void main(String[] args) throws InterruptedException {while(true){/*** 解开注释,map,map4的key将不会被回收* 我理解为,在栈(也叫线程私有栈,或者工作内存)中,每个线程会将共享数据拷贝到栈顶进行运算,* 这份数据其实是一个副本.(如果栈内部所包含的"局部变量"是引用,则仅仅是引用值在栈中,而且会占用一个引用本身的大小,具体的对象还是在堆当中,即对象本身的大小与栈空间的使用无关)* 所以这个map存在一个引用,就不会去回收它的key*/
//            System.out.println("map:"+map.size());
//            System.out.println("map2:"+map2.size());
//            System.out.println("map4:"+map4.size());//模拟被一个线程调用,然后休眠5秒,会随机被回收new Thread(()->{System.out.println("map:"+map.size());System.out.println("map2:"+map2.size());System.out.println("map4:"+map4.size());System.out.println("-------------------");}).start();TimeUnit.SECONDS.sleep(5);}}
}

转载于:https://www.cnblogs.com/sweetchildomine/p/6559276.html

WeakHashMap回收时机结合JVM 虚拟机GC的一些理解相关推荐

  1. 【JVM虚拟机】(5)---深入理解JVM-Class中常量池

    推荐阅读: 一.阿里逆天级调优方案,内部这套Java性能调优实战宝典,堪称教科书 二.亿万级流量性能瓶颈:JVM底层原理及性能调优实战教程 三.阿里的调优方案,不愧是业界No.1,吹爆这份Java性能 ...

  2. 深入理解JVM——虚拟机GC

    对象是否存活 Java的GC基于可达性分析算法(Python用引用计数法),通过可达性分析来判定对象是否存活.这个算法的基本思想是通过一系列"GC Roots"的对象作为起始点,从 ...

  3. 深入理解JVM虚拟机6:深入理解JVM类加载机制

    深入理解JVM类加载机制 简述:虚拟机把描述类的数据从class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制. 下面我们具体 ...

  4. jvm虚拟机基础知识--、java内存区域(1)

    JAVA程序运行过程 jvm的跨平台和语言无关性 所有的java程序都需要编译成class文件的形式提交给jvm虚拟机来加载,通过图可以看到class文件经过javac编译以后进入jvm虚拟机内部首先 ...

  5. JVM虚拟机-----垃圾回收相关概念

    12.垃圾回收相关概念 12.1 System.gc()的概念 在默认情况下,通过system.gc()或者Runtime.getRuntime().gc() 的调用,会显式触发Full GC,同时对 ...

  6. java jvm垃圾回收算法_深入理解JVM虚拟机2:JVM垃圾回收基本原理和算法

    本文转自互联网,侵删 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 喜欢的话麻烦点下Star哈 文章将同步到我的个人博客: www.how ...

  7. 深入理解JVM虚拟机2:JVM垃圾回收基本原理和算法

    JVM GC基本原理与GC算法 Java的内存分配与回收全部由JVM垃圾回收进程自动完成.与C语言不同,Java开发者不需要自己编写代码实现垃圾回收.这是Java深受大家欢迎的众多特性之一,能够帮助程 ...

  8. JVM虚拟机(四):JVM 垃圾回收机制概念及其算法

    垃圾回收概念和其算法 谈到垃圾回收(Garbage Collection)GC,需要先澄清什么是垃圾,类比日常生活中的垃圾,我们会把他们丢入垃圾箱,然后倒掉.GC中的垃圾,特指存于内存中.不会再被使用 ...

  9. 深入理解JVM虚拟机(二):垃圾回收机制

    谈起GC,应该是让Java程序员最激动的一项技术,我相信每个Java程序员都有探究GC本质的冲动!JVM垃圾回收机制对于了解对象的创建和对象的回收极为重要,是每个Java程序员必须掌握的技能. 本博客 ...

  10. 4、JVM垃圾回收机制、新生代的GC、GC(Minor GC、FullGC)、GC日志、JVM参数选项、元空间(笔记)

    4.JVM垃圾回收机制 4.1.新生代的GC 4.1.1.串行GC(SerialGC) 4.1.2.并行回收GC(Parallel Scavenge) 4.1.3.并行GC(ParNew) 4.2.G ...

最新文章

  1. Mysql找回管理员password
  2. 深度学习(part1)--机器学习及深度学习基础
  3. 2015年10月15日项目经理中项作业(质量管理与人力资源管理)
  4. .NET Core 小程序开发零基础系列(2)——小程序服务通知(模板消息)
  5. python模块之configparser
  6. java 保存图片_java实现保存文件图片以及读取
  7. tmpwatch命令
  8. 2017.4.23loli测试
  9. Mysql utf8 和utf8mb4 的区别
  10. win11可以支持win10驱动吗 Windows11更新驱动的步骤方法
  11. pjsip代码分析(1)——modules框架
  12. 孙正义:1万亿个物联网(IoT)器件正在加快人类进步
  13. 16进制编辑器 linux,Tweak - Linux下的16进制编辑器
  14. YUV和RGB调节色彩公式
  15. ueditor 图片水印 php,[UEditor]上传图片自动添加水印
  16. 数据仓库-Hive(一)
  17. redis热key监控
  18. 【NXP出品PINS-TOOL-IMX】IMX6ULL引脚配置工具PINS-TOOL-IMX介绍
  19. who moved my cheese 读后感
  20. android http收取文件夹,安卓Android手机系统内文件夹目录解释

热门文章

  1. readlink()不能读取硬链接的目标
  2. 从最理想的情况论证自己的观点,必然错误,为什么明知故犯?
  3. 解决办法: error: passing ‘const VideoFrame’ as ‘this’ argument discards qualifiers [-fpermissive]
  4. 插排与线分离设计的想法
  5. 解决办法:C代码中明明有,为什么编译时提示未定义的引用
  6. 现实世界与虚拟世界的差别在哪里
  7. WINDOWS10更改主题
  8. AS打包出现app:transformClassesAndResourcesWithProguardForRelease错误
  9. linux git 免密、设置用户用密码
  10. Dxg——AD(Altium Designer) 开发笔记整理分类合集【所有的相关记录,都整理在此】