b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

连引用都答不上,凭什么说你是Java服务端开发

电脑杂谈  发布时间:2019-09-04 15:07:10  来源:网络整理

mysql内存表溢出_csgo爆内存_csgo 内存溢出

学以致用csgo 内存溢出,那么这几个引用在日常中我们怎么进行使用呢?

接下来我会给出相关demo!!!

FinalReference 强引用

类似于 Object o = new Object() 这类的引用,创建一个对象后,该引用会被保存在JVM栈中,而且即使强引用存在,垃圾回收器就不会回收掉被引用的对象。

日常使用

强引用的事例比比皆是,因为在日常开发中我们是会一直去new一个对象的,而该new出来的对象便是强引用的,也就是说只要该引用存在,垃圾回收器就不会回收掉。

【划重点:JVM怎么了解引用在不在?】

SoftReference 软引用

软引用关联的对象,在内存不够的状况下,会把这种软引用关联的对象纳入垃圾回收范围中,然后进行回收,也就是说软引用并非是完全安全的,在内存不够的状况下是会被垃圾回收器回收掉的。

给出demo

csgo爆内存_mysql内存表溢出_csgo 内存溢出

通过注释便可以了解,我这儿实例化了多个大对象,然后放在softReferences数组中,之后便遍历打印出其中的对象的命名,打印结果如下

可以借助结果看出csgo 内存溢出,前面四个对象由于存储不够而被垃圾回收器回收了。

日常使用

在我司的项目中,部分是使用软引用来存放从中取出的数据,具体是做了一个中间层的封装,该中间层的作用就是在get出数据的之后会去判定数据能否为null,如果是为null再次从读取,读取后再放到软引用的集合中,这样的做法是可以避免内存溢出。

WeakReference 弱引用

弱引用比软引用更弱,被弱引用关联的对象没法存活到出现下一次垃圾回收之前,也就是说当出现GC时,无论当前内存是否足够,都会被回收掉。

给出demo

代码很简短,就是先建立一个弱引用对象,然后在gc前先打印下来证明它存在过,之后自动读取gc,再次打印,可以看出即将没了。运行结果如下

csgo 内存溢出_mysql内存表溢出_csgo爆内存

PhantomReference 虚引用

虚引用和前面不同的地方在于,一个对象能否有虚引用的存在,完全不会对其生存时间构成怎样妨碍,并且也能够借助虚引用来获得一个对象的例子,也就是说跟没有引用与之关联一样,在任何时候都或许被垃圾回收器回收。

那么这种就很容易产生问题了,虚引用的作用又是什么呢?

作用就是能在这个对象被收集器回收时收到一个系统通知,实现跟踪垃圾收集器的回收动作,比如在对象被回收的之后,会读取该对象的finalize方法。

在给出相关demo前,要先介绍一个

ReferenceQueue 引用队列

ReferenceQueue 引用原来也可以归纳为引用中的一员,可以和上述三种引用类型组合使用【软引用、弱引用、虚引用】。

那么它有何作呢?

在创建Reference时,手动将Queue注册到Reference中,而当该Reference所引用的对象被垃圾搜集器回收时,JVM会将该Reference放到该队列中,而我们便可以对该队列做些其它业务,相当于一种通知模式。

给出demo

mysql内存表溢出_csgo爆内存_csgo 内存溢出

可以从demo中看出队列的用法,运行打印结果如下

我们可以从结果中发现先是从引用中get起来的对象为null,证明里面说的难以借助虚引用来获得一个对象的例子,并且在回收后会被放在队列中。

和Reference相关的概念

首先为了便于JVM进行管控,Reference是有状况的,可以分为以下四种状态

active 一般来说内存一开始被分配的状况,而当被引用的对象的可达性发生差异后gc才会将引用放到pending队列并将其状况改为pending状态。

pending 指的是打算要被放进pending队列的对象。

enqueue 指的是对象的内存即将被回收了。

inactive 这是最后的状况,不能再变为其它状况。

JVM怎么明白引用在不在

关于JVM怎么了解引用在不在,这就涉及到了JVM的可达性分析算法了

csgo 内存溢出_mysql内存表溢出_csgo爆内存

JVM的可达性分析算法的简洁模式就是通过一系列GC Roots作为出发点,向下搜索,搜索所走过的模式称为引用链,当一个对象到GC Roots没有任何引用链,即说明从GC Roots到这个对象不可达时,证明此对象不只用,可被回收。如下图所示

对象4、5、6都是可被回收的。

那么问题来了,哪些对象可以成为GC Roots呢?

这里给出几个,如下

虚拟机栈中引用的对象

方法区中类静态属性引用的对象

方法区中常量引用的对象

本地方法栈JNI引用的对象

具体的想要深入探究的可以自行百度谷歌,或者等我上面深入探讨。

最后的最后

该篇文章基本解答了【谈谈对Java中几种引用的理解】,如果想要更深入的探究,就要从源码入手了解了。

下次遇到这样面试题,基本上就不慌了,因为实际上只要仔细看完该篇文章以及记住几个关键的地方,基本上就不会被面试官问倒了,并且该篇文章里面也解答了【JVM怎么了解引用在不在】和【哪些对象可以成为GC Roots】的问题。


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-121685-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      热点图片
      拼命载入中...