java性能优化代码 java程序性能优化

Java程序性能优化-缓冲(Buffer)(1)

常用优化组件和方法

创新互联专注于旬阳网站建设服务及定制,我们拥有丰富的企业做网站经验。 热诚为您提供旬阳营销型网站建设,旬阳网站制作、旬阳网页设计、旬阳网站官网定制、微信小程序服务,打造旬阳网络公司原创品牌,更为您提供旬阳网站排名全网营销落地服务。

本节主要介绍可用于系统性能优化的组件和性能优化思想 重点介绍缓冲和缓存这两个组件以及它们的使用方法 此外 还将介绍几种常用的优化思想 如池化对象 并行代替串行 负载均衡 以及时间换空间和空间换时间

缓冲(Buffer)( )

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

图   缓冲的示意图

图 显示了漏斗作为缓冲区的使用场景 上层系统如茶壶 下层系统如水瓶 现需要将茶壶中的水倒入水瓶中 这就有如将内存中的数据写入硬盘中一样 茶壶的出水速度可以很快 但是水瓶的瓶口很细 因此形成性能瓶颈 要将水全部倒入瓶中 必须等待瓶口的水缓缓流下 为了加快速度 可以使用一个漏斗(缓冲)

漏斗的初始口径很大 并且拥有一定的容量 因此 茶壶中的水可以先倒入漏斗中 就有如内存数据先写入一块缓冲区 只要漏斗的容量够大 茶壶里的水很快就能倒完 至此 上层系统完成工作 可以去处理其他业务逻辑 而此时 水并未完全进入瓶中 而大部分被积累在漏斗中 这就可以由下层系统慢慢处理 直到水完全进入瓶中 漏斗(缓冲区)被清空

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

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

缓冲最常用的场景就是提高I/O的速度 为此 JDK内不少I/O组件都提供了缓冲功能 比如 当使用FileWriter时 进行文件写操作的代码如下

Writer writer = new FileWriter(new File( file txt ))

long begin=System currentTimeMillis()

for (int i = ; i CIRCLE; i++) {

writer write(i)                                     //写入文件

}

writer close()

System out println( testFileWriter spend: +(System currentTimeMillis() begin))

为进行I/O优化 可以为FileWriter加上缓冲

Writer writer = new BufferedWriter(new FileWriter(new File( file txt )))                                                        //增加了缓冲

long begin=System currentTimeMillis()

for (int i = ; i CIRCLE; i++) {

writer write(i)

}

writer close()

System out println( testFileWriterBuffer spend: +(System currentTimeMillis() begin))

以上代码使用BufferedWriter为FileWriter对象增加缓冲功能 BufferedWriter对象拥有两个构造函数

public BufferedWriter(Writer out)

public BufferedWriter(Writer out int sz)

返回目录 Java程序性能优化 让你的Java程序更快 更稳定

编辑推荐

Java程序设计培训视频教程

J EE高级框架实战培训视频教程

J ME移动开发实战教学视频

Visual C++音频/视频技术开发与实战

Oracle索引技术

lishixinzhi/Article/program/Java/gj/201311/27807

Java程序性能优化-单例模式(1)

单例模式( )

单例模式是设计模式中使用最为普遍的模式之一 它是一种对象创建模式 用于产生一个对象的具体实例 它可以确保系统中一个类只产生一个实例 在Java语言中 这样的行为能带来两大好处

( )对于频繁使用的对象 可以省略创建对象所花费的时间 这对于那些重量级对象而言 是非常可观的一笔系统开销

( )由于new操作的次数减少 因而对系统内存的使用频率也会降低 这将减轻GC压力 缩短GC停顿时间

因此对于系统的关键组件和被频繁使用的对象 使用单例模式便可以有效地改善系统的性能

单例模式的参与者非常简单 只有单例类和使用者两个 如表 所示

表   单例模式角色

它的基本结构如图 所示

图   单例模式类图

单例模式的核心在于通过一个接口返回唯一的对象实例 一个简单的单例实现如下

public class Singleton {

private Singleton(){

System out println( Singleton is create ) //创建单例的过程可能会比较慢

}

private static Singleton instance = new Singleton()

public static Singleton getInstance() {

return instance;

}

}

注意代码中的重点标注部分 首先单例类必须要有一个private访问级别的构造函数 只有这样 才能确保单例不会在系统中的其他代码内被实例化 这点是相当重要的 其次 instance成员变量和getInstance()方法必须是static的

注意 单例模式是非常常用的一种结构 几乎所有的系统中都可以找到它的身影 因此 希望读者可以通过本节 了解单例模式的几种实现方式及其各自的特点

这种单例的实现方式非常简单 而且十分可靠 它唯一的不足仅是无法对instance实例做延迟加载 假如单例的创建过程很慢 而由于instance成员变量是static定义的 因此在JVM加载单例类时 单例对象就会被建立 如果此时 这个单例类在系统中还扮演其他角色 那么在任何使用这个单例类的地方都会初始化这个单例变量 而不管是否会被用到 比如单例类作为String工厂 用于创建一些字符串(该类既用于创建单例Singleton 又用于创建String对象)

public class Singleton {

private Singleton() {

System out println( Singleton is create )

//创建单例的过程可能会比较慢

}

private static Singleton instance = new Singleton()

public static Singleton getInstance() {

return instance;

}

public static void createString(){      //这是模拟单例类扮演其他角色

System out println( createString in Singleton )

}

}

返回目录 Java程序性能优化 让你的Java程序更快 更稳定

编辑推荐

Java程序设计培训视频教程

J EE高级框架实战培训视频教程

J ME移动开发实战教学视频

Visual C++音频/视频技术开发与实战

Oracle索引技术

lishixinzhi/Article/program/Java/gj/201311/27837

Java程序性能优化-对象复用“池”(2)[2]

public static Object getInnter(Object con){

Object re=null;

Field f;

try {

f = con getClass() getDeclaredField( inner )

f setAccessible(true)

re= f get(con)                  //取得内部包装的Connection

f setAccessible(false)

} catch Exception e) {

}

return re;

}

以上代码运行后 输出

con Class Type is: mchange v c p impl NewProxyConnection

Inner con Class Type is: mysql jdbc JDBC Connection

Data from DB:

o and o is same object

Data from DB:

上述代码中 首先从数据库连接池获得一个连接 发现连接类型并不是mysql的数据库连接 而是 mchange v c p impl NewProxyConnection 根据类名中可以推测 从数据库连接池中获得的连接只是一个代理 接着 通过反射 取得这个对象中名为inner的属性 并打印其Class类型 发现这才是真正的mysql连接 关闭NewProxyConnection连接 再向池中请求一个新的连接 同样获取该连接内部的实际数据库连接对象 发现 第一次使用的实际数据库连接对象o 和第二次使用的对象o 是完全相同的

这说明 前后两次数据库连接的请求均返回了相同的数据库连接 关闭NewProxyConnection连接时 并没有真正关闭数据库连接 而只是将数据库连接放入连接池保存 使得数据库连接在连接池中得到了复用 而从连接池返回的NewProxyConnection对象 只是对真实数据库连接的包装

除了线程池和数据库连接池 对于普通的Java对象 在必要的时候 也可以进行池化管理 对于那些经常使用 并且创建很费时的大型对象来说 使用对象池维护 不仅可以节省获得对象实例的成本 还可以减轻GC频繁回收这些对象产生的系统压力 但对于生成对象开销很小的对象进行池化 反而可能得不偿失 维护对象池的成本可能会大于对象池带来的好处

注意 在JDK中 new操作的效率是相当高的 不需要担心频繁的new操作对系统有性能影响 但是new操作时所调用的类构造函数可能是非常费时的 对于这些对象 可以考虑池化

返回目录 Java程序性能优化 让你的Java程序更快 更稳定

编辑推荐

Java程序设计培训视频教程

J EE高级框架实战培训视频教程

J ME移动开发实战教学视频

Visual C++音频/视频技术开发与实战

Oracle索引技术

ORACLE G数据库开发优化指南

lishixinzhi/Article/program/Java/gj/201311/27800


网页标题:java性能优化代码 java程序性能优化
分享URL:http://scjbc.cn/article/doedsoh.html

其他资讯