javaEE性能优化
性能的优化一般可以从多方面入手,前端资源,java程序,数据传输,结果缓存,数据库,jvm的GC,甚至硬件层等。
一、前端优化
影响页面性能的因素很多;
1、页面请求Http数量。
新建一个http连接需要经历tcp协议握手建立连接状态等过程,并且大部分请求和相应包含了cookie和header内容,增加网络带宽的消耗。因此、减少HTTP请求的数量能够加速页面的加载。可以通过采取合并样式和脚本文件等措施,来减少页面加载所需要请求。
设置html页面缓存方法:
静态的html页面想要设置使用缓存:
通过HTTP的META设置expires和cache-control
<meta http-equiv="Cache-Control" content="max-age=7200" /> <meta http-equiv="Expires" content="Mon, 20 Jul 2013 23:00:00 GMT" />
2、是否使用CND网络。
CDN网络能够使用户就近原则的取得所需要的资源,降低静态资源传输的网络延迟。
3、是否使用压缩。
对前端的js,css等静态资源文件可以去掉不要的注释和空格,空行等。使用gzip压缩来减少
网络上传输的字节数。当然,压缩是有成本的,会消耗服务器的cpu资源,但通常这种开销是值得的。
其他的规则还包括将样式放在页面首部加载,将js脚本放在底部加载,避免CSS样式,减少CDN查找等。
二、java程序优化
java代码的优化是找到执行java缓慢的代码,想尽办法对原有的代码进行优化。如使用单例模式,减少系统开销,将单线程变多线程,提升资源利用率,采用选择就绪模式,提供并发吞吐量,对于互不影响的流程,可以使用Future模式来提升任务效率。。。通过这些措施来提高程序的性能。
1、单例
对于I/O处理,数据库连接,配置文件解析加载等耗资源的操作,必须对这些实例创建进行限制,或使用一个公共实例。以减少系统开销。
2、Future模式。
Future模式有点类似于网上购物,在你购买商品,订单生效之后,你可以去做自己的事情,等待商家通过快递给你送货上门。Future模式就是,当某一程序提交请求,期望得到一个答复。但是可能服务器程序对这个请求的处理比较慢,因此不可能马上收到答复。但是,在传统的单线程环境下,调用函数是同步的,它必须等到服务程序返回结果,才能继续进行其他处理。而Future模式下,调用方法是异步的,原本等待返回的时间段,在主调函数中,则可以处理其他的任务
package com.test.dao; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.FutureTask; public class FutureMain { private static class ChuJu{ private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } } private class Work implements Runnable{ public void run() { } } //网上订餐 private static class OnlineLunch implements Callable{ private ChuJu chuJu; public OnlineLunch(String name){ chuJu = new ChuJu(); chuJu.setName(name); } public ChuJu call() throws Exception { System.out.println("下单"); System.out.println("等待发货。。。。"); try { Thread.sleep(10000L); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("收到货物:"); return this.chuJu; } } public static void main(String[] args) throws InterruptedException, ExecutionException { //第一步网上订购午餐 FutureTask<ChuJu> future = new FutureTask<ChuJu>(new OnlineLunch("刀")); new Thread(future).start(); //模拟去购物菜 System.out.println("走去超市。。"); Thread.sleep(3000); System.out.println("选菜。。。"); Thread.sleep(3000); System.out.println("买菜回家。。。"); Thread.sleep(3000); if(!future.isDone()){ //如果厨具还未到,等到 System.out.println("等待厨具。。。"); } ChuJu chuJu = future.get(); //开始做菜 System.out.println("厨具:"+chuJu.getName()+"到了"); } }
结果输出:
走去超市。。 下单 等待发货。。。。 选菜。。。 买菜回家。。。 等待厨具。。。 收到货物: 厨具:刀到了