java性能调优02
1、字符串优化处理
1.1 常量池的优化:当String对象拥有相同的值时,他们只引用常量池的同一个拷贝.
String a="123";
String b="123";
System.out.println(a.intern()==b.intern()); //true
1.2 字符串截取导致内存泄露问题优化(包装类都有此问题)
在使用substring方法时,在其外面使用new String()进行处理即可解决此问题(触发垃圾回收)
new String("要被截取的字符串".substring(0,3));
1.3 对于字符串的拆分,尽量使用indexOf效率更高
//将字符串arrayStr通过split拆分后放入strings集合中
public static List<String> toList(String arrayStr,String split,List<String> strings) {
int index=arrayStr.indexOf(split);
while (index!=-1) {
strings.add(new String(arrayStr.substring(0,index)));
arrayStr=new String(arrayStr.substring(index+1));
index=arrayStr.indexOf(split);
}
//判断最后一个是否是空
if (!arrayStr.trim().equals("")) {
strings.add(arrayStr);
}
return strings;
}
2、集合优化
2.1 主要用于在尾部添加的处理时,使用ArrayList的效率较高;
在头部和中间插入数据时,使用LinkedList的效率较高;
删除操作较多时,使用LinkedListde效率较高
2.2 对于集合的迭代和遍历使用原始的for(int i=0;i<10;i++)的效率会更高
2.3 使用集合是给定初始化大小,效率更高
2.4 如果需要对集合中数据尽量使用treeSet,treeMap来实现
3、常用技巧
3.1 对于工具类使用静态方法
3.2 使用clone方法代替new新的对象
3.3 对于io操作要使用带缓存的buffer包装类
3.4 对用数组的拷贝使用Arrays.copyOf()方法
3.5 使用布尔运算&&代替位运算&
3.6 对用大量的循环使用展开循环更好
3.7 对于多次使用的表达式进行提取为一个临时变量
3.8 尽量少用switch语句,使用ifelse替代
3.9 能使用位运算的尽量使用位运算(如*2,/4等操作)
3.10 能使用局部变量的就不用使用全局变量,效率更高
3.11 能不使用异常的尽量不用进行异常处理
3.12 不要使用二维数组,效率很低,使用一维数组代替即可
4、bio,aio ,nio的比较
java bio:同步并阻塞,一个连接一个线程,即客户端有连接请求时就启动一个线程进行处理,使用与连接数目小且固定的框架,对服务器的资源要求不较高,并发环境中jdk1.4之前的唯一选择
java nio:同步非阻塞,一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理,适用于连接数目多但连接时间短的架构,jdk1.4开始支持
java nio:异步非阻塞,一个有效请求一个线程,即客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理,适用于连接数目多且连接时间长的架构,jdk1.7开始支持
//通过nio进行文件复制
public void copyFileByNio(String sourceFile,String targetFile) throws Exception {
FileInputStream inputStream=new FileInputStream(new File(sourceFile));
FileOutputStream outputStream=new FileOutputStream(new File(targetFile));
//获取nio通道
FileChannel readChannel=inputStream.getChannel();
FileChannel writeChannel=outputStream.getChannel();
ByteBuffer readBuffer=ByteBuffer.allocate(1024*8);
//通过nio通道进行读写操作
while (true) {
readBuffer.clear();
int read=readChannel.read(readBuffer);
if (read==-1) {
break;
}
readBuffer.flip();
writeChannel.write(readBuffer);
}
//关闭通道
readChannel.close();
writeChannel.close();
} //通过aio复制文件
public void copyFileByAio(String sourceFile,String targetFile) throws Exception {
//获取aio异步通道
AsynchronousFileChannel readChannel = AsynchronousFileChannel.open(Paths.get(sourceFile));
OpenOption openOption=StandardOpenOption.WRITE;
//获取aio异步通道
AsynchronousFileChannel writeChannel=AsynchronousFileChannel.open(Paths.get(targetFile),openOption); ByteBuffer readBuffer=ByteBuffer.allocate(1024*8);
//通过aio通道进行读写操作
Future<Integer> result=readChannel.read(readBuffer, 0);
while (!result.isDone()) {
Thread.sleep(1);
}
readBuffer.flip();
writeChannel.write(readBuffer, 0);
//关闭通道
readChannel.close();
writeChannel.close();
}
5、ByteBuffer的常用操作
rewind()://它使限制保持不变,将位置设置为 0。
reset()://将此缓冲区的位置重置为最近标记的位置。
flip();//它将限制设置为当前位置,然后将位置设置为 0。
clear();//它将限制设置为容量大小,将位置设置为 0。
slice();//创建一个从当前位置到上限的子缓存区
ByteBuffer buffer=ByteBuffer.allocate(15);
System.out.println("上限:"+buffer.limit()+",容量:"+buffer.capacity()+",位置:"+buffer.position());
for(int i=0;i<10;i++){
buffer.put((byte)i);
}
System.out.println("上限:"+buffer.limit()+",容量:"+buffer.capacity()+",位置:"+buffer.position());
//使缓冲区为重新读取已包含的数据做好准备:它使限制保持不变,将位置设置为 0。
buffer.rewind();
System.out.println("上限:"+buffer.limit()+",容量:"+buffer.capacity()+",位置:"+buffer.position()); for(int i=0;i<10;i++){
if (i==4) {
//在此缓冲区的位置设置标记。
buffer.mark();
}else if (i==6) {
buffer.mark();
} buffer.put((byte)i);
} //将此缓冲区的位置重置为最近标记的位置。
buffer.reset();
System.out.println("上限:"+buffer.limit()+",容量:"+buffer.capacity()+",位置:"+buffer.position()); //使缓冲区为一系列新的通道写入或相对获取 操作做好准备:它将限制设置为当前位置,然后将位置设置为 0。
buffer.flip();
System.out.println("上限:"+buffer.limit()+",容量:"+buffer.capacity()+",位置:"+buffer.position()); //使缓冲区为一系列新的通道读取或相对放置 操作做好准备:它将限制设置为容量大小,将位置设置为 0。
buffer.clear();
System.out.println("上限:"+buffer.limit()+",容量:"+buffer.capacity()+",位置:"+buffer.position()); //创建一个从当前位置到上限的子缓存区
ByteBuffer subBuffer=buffer.slice();
System.out.println("上限:"+subBuffer.limit()+",容量:"+subBuffer.capacity()+",位置:"+subBuffer.position());
6、将文件内容映射到ByteBuffer缓存中
public void loadFile(String fileName) throws Exception {
RandomAccessFile file=new RandomAccessFile(fileName, "rw");
long length=file.length();
FileChannel channel=file.getChannel();
//将文件内容映射到ByteBuffer缓存中
MappedByteBuffer buffer=channel.map(MapMode.READ_WRITE, 0, file.length());
//从缓存中读取文件的内容
byte[] content=new byte[(int)length];
buffer.get(content, 0, (int)length);
System.out.println(new String(buffer.array(),"gb2312"));
channel.close();
file.close();
}
//聚集写
public void gatherWrite(String filename) throws Exception {
ByteBuffer courseBuffer=ByteBuffer.wrap("buffer 聚集写操作".getBytes("gb2312"));
ByteBuffer authBuffer=ByteBuffer.wrap("special 讲师".getBytes("gb2312"));
ByteBuffer[] buffers=new ByteBuffer[]{courseBuffer,authBuffer};
FileOutputStream outputStream=new FileOutputStream(new File(filename));
FileChannel channel=outputStream.getChannel();
channel.write(buffers);
channel.close();
outputStream.close();
} //映射读
public void mapRead(String filename) throws Exception {
FileInputStream inputStream=new FileInputStream(new File(filename));
FileChannel channel=inputStream.getChannel();
ByteBuffer b1=ByteBuffer.allocate(13);
ByteBuffer b2=ByteBuffer.allocate(100);
channel.read(new ByteBuffer[]{b1,b2});
System.out.println(new String(b1.array(),"gb2312"));
System.out.println(new String(b2.array(),"gb2312"));
channel.close();
inputStream.close();
}
java性能调优02的更多相关文章
- Java性能调优笔记
Java性能调优笔记 调优步骤:衡量系统现状.设定调优目标.寻找性能瓶颈.性能调优.衡量是否到达目标(如果未到达目标,需重新寻找性能瓶颈).性能调优结束. 寻找性能瓶颈 性能瓶颈的表象:资源消耗过多. ...
- Java性能调优(一):调优的流程和程序性能分析
https://blog.csdn.net/Oeljeklaus/article/details/80656732 Java性能调优 随着应用的数据量不断的增加,系统的反应一般会越来越慢,这个时候我 ...
- Java性能调优:利用JMC分析性能
Java性能调优作为大型分布式系统提供高性能服务的必修课,其重要性不言而喻. 好的分析工具能起到事半功倍的效果,利用分析利器JMC.JFR,可以实现性能问题的准确定位. 本文主要阐述如何利用JMC分析 ...
- Java性能调优:利用JFR生成性能日志
Java性能调优作为大型分布式系统提供高性能服务的必修课,其重要性不言而喻. 好的分析工具能起到事半功倍的效果,利用分析利器JMC.JFR,可以实现性能问题的准确定位. 本文主要阐述如何利用JFR生成 ...
- 第六章 Java性能调优工具(待续)
Java性能调优工具 Windows工具 JDK命令行工具 JConsole工具 Visual VM多合一工具 Visual VM对QQL的支持 MAT内存分析工具 MAT对QQL的支持 JProfi ...
- java 性能调优和GC
JAVA 性能调优和GC http://blog.csdn.net/gzh0222/article/details/7663181 JAVA GC调优手记 http://blog.csdn.net/f ...
- Java性能调优概述
目录 Java性能调优概述 性能优化有风险和弊端,性能调优必须有明确的目标,不要为了调优而调优!!!盲目调优,风险远大于收益!!! 程序性能的主要表现点 执行速度:程序的反映是否迅速,响应时间是否足够 ...
- Java性能调优攻略全分享,5步搞定!(附超全技能图谱)
对于很多研发人员来说,Java 性能调优都是很头疼的问题,为什么这么说?如今,一个简单的系统就囊括了应用程序.数据库.容器.操作系统.网络等技术,线上一旦出现性能问题,就可能要你协调多方面组件去进行优 ...
- Java性能调优实战,覆盖80%以上调优场景
Java 性能调优对于每一个奋战在开发一线的技术人来说,随着系统访问量的增加.代码的臃肿,各种性能问题便会层出不穷. 日渐复杂的系统,错综复杂的性能调优,都对Java工程师的技术广度和技术深度提出了更 ...
随机推荐
- 插件化框架解读之Class文件与Dex文件的结构(一)
阿里P7移动互联网架构师进阶视频(每日更新中)免费学习请点击:https://space.bilibili.com/474380680 Class文件 Class文件是Java虚拟机定义并被其所识别的 ...
- log4j基础配置使用
添加log4j的jar包:可以从maven处下载:https://mvnrepository.com/artifact/log4j/log4j/1.2.17 <!-- https://mvnre ...
- 通过URL传参数,然后第二个页面需要获取参数
/** * 方法说明:通过url参数键值名称获取参数的值 * @method getQueryString * @param name 要获取的参数键值 * @return * @remark */ ...
- python序列基本操作
这里讲一基本概念:容器---可以包含其他对象的对象:两种主要的容器是序列(列表和元祖)和映射(字典) 关于序列的通用基本操作:python中常用的序列主要有两种:列表和元祖 -------索引,切片 ...
- vue中关于checkbox数据绑定v-model
vue.js为开发者提供了很多便利的指令,其中v-model用于表单的数据绑定很常见, 下面是最常见的例子: <div id='myApp'> <input type=&qu ...
- python3 tkinter模块小项目联系之邮箱客户端
# -*- coding:utf-8 -*- from tkinter import * from tkinter.messagebox import askyesno, showerror, sho ...
- python mqtt 客户端实现
安装paho-mqtt pip install paho-mqtt -i http://pypi.douban.com/simple --trusted-host pypi.douban.com py ...
- 【知识强化】第五章 传输层 5.2 UDP协议
这节课我们来学习一下UDP协议. 那在上节课呢我们学了这样一个打油诗. 啊,就是传输层有两个好兄弟,大哥TCP和二弟UDP.大哥很靠谱,二弟不靠谱.那只要说到UDP协议我们就要知道它的一个重要的特点, ...
- linux 系统管理--进程管理
目录 linux 系统管理--进程管理 一.进程基本概述 二.监控进程状态 三.进程的优先级[进阶] 四.企业案例,Linux假死是怎么回事 五.后台进程管理 六.系统平均负载[进阶] linux 系 ...
- linux随笔-05
shell脚本&定时任务 编写Shell脚本 可以将Shell终端解释器当作人与计算机硬件之间的“翻译官”. Shell脚本命令的工作方式有两种:交互式和批处理. 交互式(Interactiv ...