在我们系统开发中,有许多关于性能提升方面的组件,这里介绍并总结一下;

缓冲(Buffer)

缓冲区是一块特定的内存区域。开辟缓冲区的目的是通过缓解应用程序上下层之间的差异,提高系统的性能。在日常生活中,缓冲的一个典型应用是漏斗;

漏斗,相当于缓冲区,漏斗口很大,可以及时处理上面倒出的水,这就意味着上层系统效率很高,下层系统效率很低,,因为瓶口很细,无法及时将水倒入瓶中;我感觉漏斗也像是一种模式,适配器模式,假设有一个水壶的口很大,而瓶子的口很小,这个时候就需要一个适配器漏斗了,他能把两端桥接起来,使得他们能够进行传输;

注意:缓冲可以协调上层组件和下层组件的性能差。当上层组件性能优于下层主件时,可以有效减少上层组件对下层组件的等待时间。

基于这样的结构,上层应用组件不需要等待下层组件真实的接受全部数据,即可返回操作,加快了上层组件的处理速度,从而提升系统的整体性能。

缓冲最常用的场景就是提高I/O的速度。JDK内不少组件都提供了缓冲功能,一般名字里面都会带Buff。

Writer writer=new BufferedWriter(new FileWriter("C:\\E盘\\teacher.java"));

IO使用的主要设计模式使装饰者模式,这里来看一看源码

  public BufferedWriter(Writer out, int sz) {super(out);if (sz <= 0)throw new IllegalArgumentException("Buffer size <= 0");this.out = out;cb = new char[sz];nChars = sz;nextChar = 0;lineSeparator = java.security.AccessController.doPrivileged(new sun.security.action.GetPropertyAction("line.separator"));}
 private static int defaultCharBufferSize = 8192;

其内部是创建了一个8192大小的字符串缓冲区;

一般来说,缓冲区不宜过小,过小的缓冲区无法起到真正的缓冲作用,缓冲区也不宜过大,过的的缓冲区会浪费系统内存,增加GC负担。

缓存(Cache)

缓存也是一块为提升系统性能而开辟的内存空间,缓存的主要作用是暂存数据处理结构,并提供下次访问使用,频繁的访问数据库会耗费CPU资源也会使数据库的性能降低,缓存的作用就是讲这些数据暂时存储起来,当有其他线程或者客户端需要查询相同的数据资源时,可以省略对这些数据的处理流程,而直接从缓存中获取处理结果,bong立即返回给请求组件,以此提高系统的相应时间。

缓存的使用非常普遍,比如,目前流行的几种浏览器都会在本地缓存远程的页面,从而减少远程HTTP访问次数,加快网页的加载速度,又比如,在服务端的系统开发中,设计人员可以为一些核心API加上缓存,从而提高系统的整体性能。

最为简单的缓存可以直接使用HashMap实现,当然,这样会有很多问题,比如上面时候该清理无效的数据,如何防止缓存数据过多而导致的内存溢出等,现在市面上有很多缓存,自己常用的有EhCache,memcache等。

对象复用池

对象池化,是目前非常常用的一种系统优化技术,它的核心思想是,如果一个类被频繁的请求使用,那么不必每次都生成一个实例,可以将这个类的一些实例保存在一个池中,待需要使用的时候直接从池中获取。这个“池”就被称为对象池。在实现细节上,它可能是一个数组,一个链表或者任何集合类。

对象池的使用非常广泛,比较常用的就是线程池和数据库连接池。线程池中,保存着可以被重用的线程对象,当有任务被提交到线程池,系统并不需要新建线程,而是从池中获得一个可用的线程,执行这个任务,在任务结束后,也不关闭线程,而将它返回到池中,以便下次继续使用。由于线程的创建和销毁是较为费时的工作,因此,在线程调度频繁的系统中,线程池可以很好地改变性能。

数据库连接池也是一种特殊的对象池,它用于维护数据库连接的集合。当系统需要访问数据库时,不需要重新建立数据库连接,而可以直接从池中获取;在数据库操作完成后,也不关闭数据库连接,而是将连接返回到连接池中。由于数据库连接的创建和销毁是重量级的操作,因此,避免频繁进行这两个操作,对改善系统的性能也有积极意义。

目前应用较为广泛的数据库连接池组件有C3P0和Proxool。其中C3P0是伴随着Hibernate一起发布,与hibernate联系紧密的数据库连接池。

除了这两个,对于普通的JAVA对象,在必要的时候,也可以进行池化管理,对于那些经常使用,并且创建很费时的大型对象来说,使用对象池维护,不仅可以节省获得对象实例的成本,还尅减轻GC频繁回收这些对象产生的系统压力;

并行替代串行

能够使用多线程的尽量使用多线程去处理;

负载均衡

对大型应用来说,系统负载可能非常重。这个时候就要使用负载均衡了。

一个典型的实现便是Tomcat集群。配置Tomcat集群实现负载均衡,可以通过Apache服务器实现,即,使用Apache服务器作为负载分配器,将请求转向各个Tomcat服务器,从而实现负载均衡。

时间换空间

由于系统资源是有限的,为了在有限的资源内,达成某些特定的性能目标,就需要使用时间换空间或者空间换时间的方法。

时间换空间通常用于嵌入式设备,或者内存,硬盘不足的情况,通过使用牺牲CPU的方式,换的原本需要更多内存或者磁盘空间才能完成的工资。

下例是一个非常简单的时间换空间的 算法,实现了a,b两个变量的值交互,交换两个变量最常用的方法是使用一个中间变量,而引入额外的变量则需要更多的空间,采用下面的方法,则可以免去中间变量,而达到变量交互的目的,其代价是花费了更多的时间

a=a+b;
b=a-b;
a=a-b;

空间换时间

与时间换空间的方法相反,空间换时间则是采用更多的内存或者磁盘空间换取CPU资源或者网络资源等,通过增加系统的内存消耗,来加快程序的运行速递。

这个方法最常用的就是缓存,缓存就是一块内存区域,

上面简单的介绍了几个常用的缓存组件,以后会详细的去分析这些东西来对java程序性能进行优化;

Java常用缓存组件和方法相关推荐

  1. java常用类的方法,java常用类的使用方法

    java常用类的使用方法 Interger:整数类型 1.属性. static int MAX_VALUE:返回最大的整型数: static int MIN_VALUE:返回最小的整型数: stati ...

  2. JAVA常用的XML解析方法

    转并总结自(java xml) JAVA常用的解析xml的方法有四种,分别是DOM,JAX,JDOM,DOM4j xml文件 <?xml version="1.0" enco ...

  3. Java 常用缓存淘汰算法解析

    前言 对于很多缓存中间件来说,内存是其操作的主战场,以redis来说,redis是很多互联网公司必备的选择,redis具有高效.简洁且易用的诸多特性被大家广泛使用,但我们知道,redis操作大多数属于 ...

  4. java常用的集合和方法

    1.Collection集合 1.1为什么使用集合 数组在使用时: ​ 1.要定义容器的大小,超了直接报异常 ​ 2.数组操作的方法很少,没有专门的封装方法 ​ 3.数据类型也比较单一 期望有一个ja ...

  5. 郑州尚学堂:JAVA常用4种排序方法

    JAVA中在运用数组进行排序功能时,一般有四种方法:快速排序法.冒泡法.选择排序法.插入排序法. 当然 程序中最简单的使用就是:快速排序和冒泡排序,插入排序的使用更具有技巧性,选择排序则过于复杂,冗杂 ...

  6. Java常用数据类和方法

    8种基本数据类型 数据类型 boolean 布尔 1b char 字符数据类型 2b short -216~216-1 2b int -232~232-1 4b long -264-264 8b fl ...

  7. java常用序列化与反序列化方法

    序列化工具类 序列化即将对象序列化为字节数组,反序列化就是将字节数组恢复成对象. 主要的目的是方便传输和存储. 序列化工具类: public class SerializeUtil {private ...

  8. java 类 函数,java常用类和函数

    JAVA中常用类的常用方法_计算机软件及应用_IT/计算机_专业资料.. JAVA 中常用类的常用方法 一. java.lang.Object 类 1. clone ()方法 创建并返回此对象的... ...

  9. java用redis缓存的步骤_详解在Java程序中运用Redis缓存对象的方法|chu

    这段时间一直有人问如何在Redis中缓存Java中的List 集合数据,其实很简单,常用的方式有两种: 1. 利用序列化,把对象序列化成二进制格式,Redis 提供了 相关API方法存储二进制,取数据 ...

最新文章

  1. 如何在 Swift 语言下使用 iOS Charts API 制作漂亮图表?
  2. only one element tensors can be converted to Python scalars
  3. python考证什么时候报名-2020年计算机二级考试时间最新安排
  4. feture selection
  5. 3种python调用其他脚本的方法,你还知道其他的方法吗?
  6. inotify加rsync备份mysql_centos7 实现inotify-tools + rsync,自动备份mysql数据库
  7. 为什么消息队列不实现精准一次(exactly once)?
  8. 圆通速递:2022年1月快递产品收入36.19亿元 同比增长20.09%
  9. php bmp中创建图像bmp2gd,让GD支持32位BMP
  10. 1.1 Application Fundamentals - 应用原理
  11. 【免积分下载】吴恩达 机器学习笔记PDF版v5.5.pdf
  12. 哈哈哈,这个勒索软件笑死我了!太菜了~
  13. 老调新弹,也玩Linq To Sql批操作
  14. 中移物联网入门记录(1)
  15. PHP steam第三方登录,网站支持第三方STEAM登录了
  16. Java程序员必会!java语言的编译命令是什么
  17. 基于python和opencv的图像分割旋转裁剪
  18. Python全栈(九)Web前端基础之3.CSS常见样式和选择器
  19. 正则表达式前瞻(?=)、后顾(?)、负前缀(?!)、负后顾(?!)
  20. 多平台epub阅读器推荐

热门文章

  1. Centos--时间/日历/计算器
  2. 论文精讲 | 一种隐私保护边云协同训练
  3. 需求来源以及竞品分析
  4. ISO 14443 非接触式射频卡标准学习
  5. 孙宇晨:“这就像1932年的毕加索”
  6. 腾格里沙漠部分污染地被填埋 记者采访被限自由
  7. Unity 2D横版移动跳跃
  8. IT行业里哪些岗位既火爆又高薪?
  9. jsp+servlet实现个人博客系统
  10. 《2018人工智能芯片技术白皮书》发布