强软弱虚以及应用

Java中的引用类型

强软弱虚

强引用: 普通的引用

软引用: 垃圾回收器内存不够的时候会回收软引用指向的对象,为新加数据腾空间
适合做缓存

弱引用: 垃圾回收器一看到就会回收

虚引用:直接看到就回收,跟没有一样

虚引用的作用:

堆外内存=操作系统内存-JVM内存

当我们通过BIO,OIO的方式去访问外部网络的时候,数据会先进入堆外内存的缓冲区,然后再复制一份给到我们的JVM内存。任何一份数据传来传去量比较大,

而且我们的JVM往外发的时候也需要通过复制到操作系统的Buffer,然后这个Buffer将数据再往外传。

所以这种方式效率是非常低下的。

所以JVM想提高效率,在NIO里面,它就做了一个类,这个类叫做:DirectByteBuffer。有什么用呢?

我们JVM这个对象在访问缓冲区读取对象的时候,不是访问的JVM的缓冲区,而是直接访问的堆外内存的缓冲区,它是由操作系统直接管理的。

所以它也存在一个问题。当这个对象没有一个引用指向它的时候,我需要回收这块内存。没错,这块内存回收了,那它指向的那个堆外内存谁去回收它呢?

没有人去回收它。那就会产生内存泄露。

那么我怎么办呢,当这个引用被回收的时候,我会监测某一个Queue,这个队列我监测到,当我有一个对象被回收的时候,这个对象所指向的那块内存,我会把它给回收掉。这谁来干?

GC线程。[是C++写的]

[注意:因为虚引用是管理堆外内存,所以如果没有涉及到堆外内存,其实虚引用起不到作用。只有当它和外部数据I/O的时候,虚引用才起作用]

那么,什么是ThreadLocal?

每个线程的内部,有存放线程的本地变量, 这个变量是这个线程专享的,这个线程是不会进行共享的。它是做线程同步的一种工具。把这个变量把每个线程里面,单独存一份。和其他不互相冲突。这个我们可以称之为ThreadLocal

那么,ThreadLocal是怎么做到线程专享的呢?

在使用ThreadLocal时,它会自定义一个ThreadLocalMap对象,然后将存入ThreadLocal的数据以KeyValue的形式存入TheradLocalMap。这个对象是ThreadLocal专享的。这个线程是不会进行共享的。它是做线程同步的一种工具。

[事务的操作本来就是应该由数据库来进行控制的,但是为了方便用户进行业务逻辑的操作,Spring对事务功能进行了扩展实现。由Spring来帮忙进行控制]

那么,Spring事务使用@Transactional,

connection数据库的时候,是怎么保证多表查询得到的是同一个数据库对象呢?

用ThreadLocal。

就是因为将数据存放到了一个ThreadLocal的TheradLocalMap对象里面。

ThreadLocal的内存泄露问题

我们可以知道,我们的数据是存放在ThreadLocal里面的ThreadLocalMap里面的,ThreadLocalMap是以弱引用的方式指向了ThreadLocal。

 

如果使用强引用,就会造成内存泄露问题。

为什么呢?

因为正常情况下,我们使用new ThreadLocal获取t1去正常使用的时候,没有问题。但是当我t1==null了以后,没有数据再指向ThreadLocal了。此时ThreadLocal应该被回收。但是如果我t1.set了对象进ThreadLocalMap,而此时ThreadLocalMap是强引用指向ThreadLocal的话,那么就没有办法回收这个没有对象指向的数据。就会造成内存泄露问题。

所以我们将ThreadLocalMap指向ThreadLocal设置为弱引用。当没有数据指向ThreadLocal的时候,下次GC来

到看到该数据,就会自动回收掉。

但是假设我们把t1==null了,这个ThreadLocal对象就没有了。那么ThreadLocalMap里面的key是以ThreadLocal名为Key的,那么它就==null了。这个时候我们的Value就没有办法找到了。就无法回收了。所以在我们确定该ThreadLocal不用的时候,在最下方的代码务必写一个:t1.remove();将整个Entry干掉。

如果不使用remove的话,里面的数据会越来越多,慢慢的也会造成内存泄露。

[内存泄漏:内存里存放了太多无用的东西,导致想要存储数据的时候存不进去。]

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值