亨元模式 四大引用 逃逸引用 池化思想

亨元模式

说到享元模式,第一个想到的应该就是池技术了,String常量池、数据库连接池、缓冲池等等都是享元模式的应用,所以说享元模式是池技术的重要实现方式。

  比如我们每次创建字符串对象时,都需要创建一个新的字符串对象的话,内存开销会很大,所以如果第一次创建了字符串对象“adam“,下次再创建相同的字符串”adam“时,只是把它的引用指向”adam“,这样就实现了”adam“字符串再内存中的共享

享元模式(Flyweight),运用共享技术有效地支持大量细粒度的对象。UML结构图如下:

四大引用

什么是java的四大引用

是JDK1.2版本开始引入,把对象的引用分为4个等级,我们平时学习的就是四种的第一级的强引用,说白了,就是Object o = new Object() ,四个引用分别是强引用、软引用、弱引用和虚引用,请记住它们的顺序!因为这是它们对内存的敏感程度!
等级: 强 > 软 > 弱 > 

它们有什么作用

灵活的控制对象的生命周期
提高对象的回收机率

什么是强引用

- 强引用就是我们平时使用的对象方式,也是使用最多的一种方式,**请记住不管内存紧张也罢,不足也罢,gc永不回收强引用的对象, 即使jvm 出现(内存溢出错误)OutOfMemoryError,使程序停止,也不会回收对象来提高内存**

什么是软引用

-  对象具备软引用,**请记住,只要内存足够,我们不对对象回收,但是当内存不足,gc对软引用对象进行回收** 可以看出软引用对内存很敏感,可用来高速缓存,同时它可以结合队列使用,如果软引用被gc回收,jvm就会把软引用加入到队列中 

什么是弱引用

-  gc不内存是发现弱引用,就会立刻回收弱引用对象,但是我们知道gc是一个优先级很低的线程,所以不一定立刻发现并回收弱引用对象,**但记住,只要被gc发现弱引用,不管内存够不够,直接回收**,同时,弱引用,也可以结合队列使用,当被回收,就进去于之关联的队列中

 什么是虚引用

虚引用就是和没有任何引用一样,任何时候都可能被回收,**它必须与队列联合使用**
 

逃逸引用

逃逸分析是目前Java虚拟机中比较前言的优化技术,他与类型继承关系分析一样,并不是直接优化代码的手段,而是为前天优化手段提供依据的分析技术。
逃逸分析的基本行为就是分析动向的动态作用域:当一个对象在方法中被定义后,它可能被外部方法所引用,例如,作为调用参数传递到其他方法中。成为方法逃逸。甚至还有可能被外部线程访问到,例如赋值给类变量或者可以在其他线程中访问的实例变量,成为现场逃逸。

ublic class EscapeTest {
public static Object globalObj;

// 给全局变量赋值,发生逃逸
public void globalVariableEscape() {
globalObj= new Object();
}

// 方法返回值,发生逃逸
public Object methodEscape() {
return new Object();
}

// 实例引用发生逃逸
public void instanceEscape() {
test(this);
}
}

栈上分配

栈上分配主要是指在Java程序的执行过程中,在方法体中声明的变量以及创建的对象,将直接从该线程所使用的栈中分配空间。 一般而言,创建对象都是从堆中来分配的,这里是指在栈上来分配空间给新创建的对象。

所以java对象不光存在堆上,而栈中可能也会有

池化技术(待补充)

池化技术能够减少资源对象的创建次数,提高程序的性能,特别是在高并发下这种提高更加明显。使用池化技术缓存的资源对象有如下共同特点:1,对象创建时间长;2,对象创建需要大量资源;3,对象创建后可被重复使用。


原文地址:https://www.cnblogs.com/wangjincai/p/13221411.html