一)、缓冲

作用:缓解程序上下层之间的性能差异。

1)、当上层组件的性能优于下层组件时加入缓冲机制可以减少上层组件对下

	   层组件的等待时间。

2)、上层组件不需要等待下层组件接收全部数据,即可返回操作,加快了上

	    层组件的处理速度。

缓冲的应用:

JDK的I/O组件提供了缓冲功能。

例:当对文件进行写操作时需要从内存中读取数据写入到硬盘,此时,文件从

	内存中的读取速度比写入硬盘的速度快,此时就出现了上层组件的性能优

	于下层组件的情况,此时可以加入缓冲机制BufferInputStream()先将数据

	写入缓冲区,再将数据写道硬盘中。

二)、缓存

定义:是一块为提高系统性能的内存空间。

作用:暂存数据处理结果,并提供下次访问使用。

应用场景:

数据处理或数据获取可能会非常耗时,当数据的请求量很大时,频繁的数据处

理会耗尽cpu资源。

简单缓存的实现:直接使用HashMap

弊端:

1)、不知道应该何时清理无效数据。

2)、如何防止数据过多导致内存溢出。

基于java的缓存框架:
  1. EHCache: Hibernate默认的数据缓存解决方案。

  2. OSCache: 由OpenSymphony设计的,可以缓存任何对象,甚至是缓存

    部分JSP页面,或者Http请求。

  3. JBossCache: 由JBoss开发,可用于JBoss集群间数据共享的缓存框架。

    缓存的应用:建议在频繁使用且重负载的的函数中加入缓存,以提高它在频繁调用的性能,可以根据传入的参数构建key。

    基于动态代理的缓存解决方案:

     1).在方法中加入缓存的弊端:缓存组件和业务层代码紧密耦合,依赖性强。
    1. . 使用动态代理实现缓存好处:在业务层,无需关注对缓存的操作,代码被完全独立并隔离,对一个新的函数方法,加入缓存不会影响原有方法的实现。

三)、对象复用池

对象池化:若一个类被频繁请求使用,则将这个类的实例保存在一个池中,使用时,直接从池中获取。

对象池可以是一个数组、链表或任何集合类。

对象池的应用:

1)、线程池:

2)、数据库连接池

广泛使用的数据连接池组件:

1)、c3p0连接池 2)、ProXool连接池

c3p0连接池的实现:

Connection con = pool.getConnection()

con的类类型:com.mchange.V2.c3p0.impl.NewProxyConnection

1)、通过数据连接池对象调用getConnection获取数据库连接对象,此时得到的 Connection对象时一个NewProxyConnection代理对象.

2)、实际的数据库连接对象是在Connection中的一个内部类对象来连接获取的

    Object re = f.get()

    re的类类型:com.msql.jdbc.JDBC4Connection

 Field  f =  con.getClass().getDeclaredFiled("inner") //通过反射获取内部类对象
Object re = f.get() //获取实际的数据库连接

结论:当调用con.close()并没有真正的关闭数据库的连接,而是将数据库连接放入数据库连接池保存,当用户第二次调用getConnection时从连接池中获取 连接对象。

四)、Jakarta commons Pool对象池组件

Jakarta commons Poll对象池组件由Apache提供。

定义了两个接口:

ObjectPool(对象池接口)

public interface ObjectPool{
//从对象池中取一个对象
T boorowObject();
//将对象返回给对象池
void returnObject(T boorowed);
}

PoolableObjectFactory : 对象池管理工厂

public interface PoolableObjectFactory{
//创建对象,若对象池没有对象,在borrowObject()时会自动调用
T MakeObject();
//在创建对象前使用,激活对象
void activateObject(T Object);
//在对象返回对象池时使用
void passivateObject(T Object);
//判断对象是否可用
void validateObject(T Object);
//pool.close()对象从对象池中销毁使用
void destoryObject(T Object);
}

内置定义了3个对象池

1)、StackObjectPool

使用java.util.Stack来保存对象,可以指定初始化大小,当空间不够时,可以自

     动增长,无可用对象时,可以自动创建新对象。

2)、GenericObjectPool

通用对象池,可以设定对象池的容量,可设定无可用对象时,对象池的表现行

    为(等待或创建新实例),可以设置对象有效性检查

3)、softReferenceObjectPool

使用ArrayList保存对象,不保存对象的强引用,只保存对象的弱引用,对对象

数量没有限制,当没有对象时会自动创建对象,当内存紧张时,Jvm自动回收

具有弱引用对象。

缓冲&缓存&对象池概念的理解的更多相关文章

  1. javascript设计模式学习之四——单例模式,缓存与对象池

    单例模式的定义:确保一个实例,并提供全局访问. 惰性单例的定义:只在需要的时候才创建对象. 在开发中,有些对象往往只需要一个,比如线程池.全局缓存.浏览器中的window对象等. java中的单例 关 ...

  2. 抓到 Netty 一个隐藏很深的内存泄露 Bug | 详解 Recycler 对象池的精妙设计与实现

    欢迎关注公众号:bin的技术小屋,如果大家在看文章的时候发现图片加载不了,可以到公众号查看原文 本系列Netty源码解析文章基于 4.1.56.Final版本 最近在 Review Netty 代码的 ...

  3. Netty轻量级对象池实现分析

    什么是对象池技术?对象池应用在哪些地方? 对象池其实就是缓存一些对象从而避免大量创建同一个类型的对象,类似线程池的概念.对象池缓存了一些已经创建好的对象,避免需要时才创建对象,同时限制了实例的个数.池 ...

  4. Unity 游戏框架搭建 (十九) 简易对象池

    在Unity中我们经常会用到对象池,使用对象池无非就是解决两个问题: 一是减少new时候寻址造成的消耗,该消耗的原因是内存碎片. 二是减少Object.Instantiate时内部进行序列化和反序列化 ...

  5. 大数据技术之_27_电商平台数据分析项目_02_预备知识 + Scala + Spark Core + Spark SQL + Spark Streaming + Java 对象池

    第0章 预备知识0.1 Scala0.1.1 Scala 操作符0.1.2 拉链操作0.2 Spark Core0.2.1 Spark RDD 持久化0.2.2 Spark 共享变量0.3 Spark ...

  6. python tips:小整数对象池与字符串intern

    本文为is同一性运算符的详细解释.is用于判断两个对象是否为同一个对象,具体来说是两个对象在内存中的位置是否相同. python为了提高效率,节省内存,在实现上大量使用了缓冲池技术和字符串intern ...

  7. 【JVM】Java 8 中的常量池、字符串池、包装类对象池

    1 - 引言 2 - 常量池 2.1 你真的懂 Java的“字面量”和“常量”吗? 2.2 常量和静态/运行时常量池有什么关系?什么是常量池? 2.3 字节码下的常量池以及常量池的加载机制 2.4 是 ...

  8. 对象池与.net—从一个内存池实现说起

    本来想写篇关于System.Collections.Immutable中提供的ImmutableList里一些实现细节来着,结果一时想不起来源码在哪里--为什么会变成这样呢--第一次有了想写分析的源码 ...

  9. common-pool2对象池(连接池)的介绍及使用

    我们在服务器开发的过程中,往往会有一些对象,它的创建和初始化需要的时间比较长,比如数据库连接,网络IO,大数据对象等.在大量使用这些对象时,如果不采用一些技术优化,就会造成一些不可忽略的性能影响.一种 ...

随机推荐

  1. python编程系列---Pycharm快捷键(更新中....)

    以下是我常用到的Pycharm快捷键(还有很多,只是我暂时用的最多的就这些): 在开发过程中,经常使用一些快捷键会大大提高开发效率,不要因为看这多而不用,常用的就那些,用得多就都记住了,脱离鼠标,逼格 ...

  2. Arduino学习笔记⑦ EEPROM断电保存数据

    1.前言     EEPROM,叫做电可擦可编程可读寄存器(是不是觉得好官方,不知道是什么鬼?反正我也一脸懵逼),只需要知道这是一种断电后数据不会丢失的存储设备,可以用来应对需要做记录做保存的场合.简 ...

  3. uni-app swiper设置自定义高度

    话不多少先上图, 大家可以看到图片中红色区域是头部区域,黄色区域则是我们要滑动的区域. 大家可以在uni-app官网上看到swiper高度是默认100%,而swiper-item则是要有固定宽高的,要 ...

  4. 小程序预览pdf文件

    有个业务需求,需要在小程序查看客户已开的发票 发票地址: https://www.chinaeinv.com/p.jspa?cxxxxxxxxxxxx 刚开始是想利用webview当作外链进行跳转访问 ...

  5. java面试官:兄弟简单谈谈Static、final、Static final各种用法吧

    前言 对Static.final.Static final这几个关键词熟悉又陌生?想说却又不知怎么准确说出口?好的,本篇博客文章将简短概要出他们之间的各自的使用,希望各位要是被你的面试官问到了,也能从 ...

  6. TwoHandleSlider/RangeSlider

    项目需求:双滑块slider,可以实现选择一个范围 (一)添加两个slider,并把背景以及fill设置为透明,并去除RaycastTarget (二)在背景下添加个一个image,背景图为滑块划过后 ...

  7. 怎么安装wordcloud

    python第三方组件有很多都是whl文件,遇到这样的whl文件应该怎样安装呢,今天来介绍一下whl文件怎样安装. 更多内容访问omegaxyz.com 先推荐一个非正式第三方whl文件包的网站: h ...

  8. 2018.8.1 python中字典的增删改查及其它操作

    一.字典的简单介绍 1.dict 用{}来表示       键值对数据           {key:value} 唯一性 2.键都必须是可哈希,不可变的数据类型就可以当做字典中的键 值没有任何限制 ...

  9. phpStorm //todo 的用途

    用phpstorm看到别人的代码使用了注释//todo,且todo是彩色的 我想这个应该是有点用的吧,于是百度了下,大概是可能由于某些原因,导致部分代码没有写.但又怕忘了, 用//todo就可以做提示 ...

  10. NOIP提高组/CSP-S复赛需掌握的算法

    1.排序算法(快排.选择.冒泡.堆排序.二叉排序树.桶排序) 2.DFS/BFS 也就是搜索算法,剪枝务必要学! 学宽搜的时候学一下哈希表! 3.树 ①遍历 ②二叉树 ③二叉排序树(查找.生成.删除) ...