ThreadLocal 内存泄漏避免

ThreadLocal的原理是操作Thread内部的一个ThreadLocalMap,这个Map的Entry继承了WeakReference,设值完成后map中是(WeakReference,value)这样的数据结构。java中的弱引用在内存不足的时候会被回收掉,回收之后变成(null,value)的形式,key被收回掉了。
如果线程执行完之后销毁,value也会被回收,这样也没问题。但如果是在线程池中,线程执行完后不被回收,而是返回线程池中,Thread有个强引用指向ThreadLocalMap,ThreadLocalMap有强引用指向Entry,导致value无法被回收,一直存在内存中。在执行了ThreadLocal.set()方法之后一定要记得使用ThreadLocal.remove(),将不要的数据移除掉,避免内存泄漏。通过分析源码,java也做了一定优化,即使出现了上述的(null,value)情况,再调用一次ThreadLocal.set()也可以将这个废弃的替代调用。

2020/2/19 源自  Java

HashMap 理解

  • 请说一下 HashMap 的原理
    HashMap基于hashing原理,我们通过put()和get()方法储存和获取对象。当我们将键值对传递给put()方法时,它调用键对象的hashCode()方法来计算hashcode,让后找到bucket位置来储存值对象。当获取对象时,通过键对象的equals()方法找到正确的键值对,然后返回值对象。HashMap使用链表来解决碰撞问题,当发生碰撞了,对象将会储存在链表的下一个节点中。 HashMap在每个链表节点中储存键值对对象。当两个不同的键对象的hashcode相同时会发生什么? 它们会储存在同一个bucket位置的链表中。键对象的equals()方法用来找到键值对。

  • 依赖注入的好处和控制反转的理解
    依赖注入的好处:组件解耦,各个组件方便单元测试。各个组件无直接关系,但是可以组装工作。
    控制反转:顾名思义,主动变为被动的处理。

2018/8/20 源自  Java

Eclipse 无法更改 Dynamic Web Module 解决方案 Cannot change version of project facet Dynamic Web Module to 3.0 Error in Eclipse

阅读原文   2018/8/17 源自  Java

JAVA8 中 LocalDateTime 任意时间组合匹配当前时间 now() 触发条件

LocalDateTime 是 jdk8 新添加的 API,改变了以往 java.util.Date 的弊端,进行对年月日、时分秒进行重构,不仅 API 看着更直观,使用起来也更方便。

jdk8 以前的版本 java.util.Date 和 SimpleDateFormat 是非线程安全的,我们再使用的过程中,一般会配合 ThreadLocal 使用,保证在并发环境中,时间戳不会被其他线程篡改。LocalDateTime 天生就是线程安全的,并且时间戳一旦初始化,就不能进行更改,从根本上保证了多线程并发的支持。

阅读原文   2018/8/3 源自  Java

JMeter 聚合报告的字段名称解释

阅读原文   2018/8/17 源自  Java