1、阿姆达尔定律

  1.1 加速比=优化后的耗时/优化前的耗时

  1.2 阿姆达尔定律   s<=1/F+(1-F)/N

    其中:s为加速比,F为程序的串行化比重,n为cpu处理核数

2、调优层次(设计调优、代码调优、JVM调优、数据库调优)

  2.1 设计模式

    2.1.1 单列模式:常见应用spring注解,以及实现当前在线人数的统计

      基本要素:构造方法私有化,提供公共的获取实例的方法

public class SingleSessionUserList {

    private static final SingleSessionUserList sessionUserList=new SingleSessionUserList();

    //提供公共的方法接口
public static SingleSessionUserList getInstance() {
return sessionUserList;
} //将构造方法私有化
private SingleSessionUserList() {
}
}

    2.1.2 代理模式

      核心思想:只有在真心需要时才进行初始化,否则只返回当前对象的代理对象

      基本要素:主题接口、真实主题、代理类

/**
* IDbQuery
* @Description 主题接口
*/
public interface IDbQuery {
//比较耗时的方法
public String request();
} /**
* DbQuery
* @Description 真实主题
*/
public class DbQuery implements IDbQuery {
@Override
public String request() {
return "比较耗时的操作结果";
}
} /**
* DbQueryProxy
* @Description 代理类
*/
public class DbQueryProxy implements IDbQuery {
private DbQuery dbQuery;//真实主题
@Override
public String request() {
//真正需要使用DbQuery
if (dbQuery==null) {
dbQuery=new DbQuery();
}return dbQuery.request();
}
} /**
* ProxyTest
* @Description 代理类的测试
*/
public class ProxyTest {
@Test
public void testProxy() {
IDbQuery dbQuery=new DbQueryProxy();
dbQuery.request();
}
}

    动态代理的实现

/**
* JdkDbQueryHandler
* @Description 使用jdk反射的反射获取动态代理
*/
public class JdkDbQueryHandler implements InvocationHandler {
IDbQuery dbquery;
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if (dbquery == null) {
dbquery = new DbQuery();
}
//调用真实主题的方法
return method.invoke(dbquery, args);
} //获取动态代理对象
public static IDbQuery getJdkDbQueryProxy() {
IDbQuery jdkDbQueryProxy=(IDbQuery) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(),
new Class[] { IDbQuery.class }, new JdkDbQueryHandler());
return jdkDbQueryProxy;
}
} /**
* CglibDbQueryHandler
* @Description 使用cglib创建动态代理
*/
public class CglibDbQueryHandler implements MethodInterceptor {
private DbQuery dbQuery;
@Override
public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy)
throws Throwable {
if (dbQuery==null) {
dbQuery=new DbQuery();
}
//调用真实主题的方法
return method.invoke(dbQuery, args);
} //cglib方法获取动态代理对象
public static IDbQuery getCglibDbQueryProxy() {
Enhancer enhancer=new Enhancer();
enhancer.setCallback(new CglibDbQueryHandler());
enhancer.setInterfaces(new Class[]{IDbQuery.class});
return (IDbQuery) enhancer.create();
}
}

    2.1.3 享元模式

      核心思想:如果系统中多次使用相同的对象,每次只需要获取对象的拷贝,不需要重新创建一个新的对象

/**
* IReportManager
* @Description 报表管理器
*/
public interface IReportManager {
//生成报表
public String createReport();
} /**
* FinancialReportManager
* @Description 财务报表生成器实现类
*/
public class FinancialReportManager implements IReportManager {
@Override
public String createReport() {
return "财务报表";
}
} /**
* EmployeeReportManager
* @Description 员工报表生成器
*/
public class EmployeeReportManager implements IReportManager {
@Override
public String createReport() {
return "员工报表";
}
} /**
* ReportManagerFactory
* @Description 报表生成器工厂
*/
public class ReportManagerFactory {
Map<String, IReportManager> financialReportManagers=new HashMap<String, IReportManager>();
Map<String, IReportManager> employeeReportManagers=new HashMap<String, IReportManager>(); public IReportManager getFinancialReportManager(String tid) {
IReportManager financialReportManager=financialReportManagers.get(tid);
if (financialReportManager==null) {
financialReportManager=new FinancialReportManager();
financialReportManagers.put(tid, financialReportManager);
}
return financialReportManager;
} public IReportManager getEmployeeReportManager(String tid) {
IReportManager employeeReportManager=employeeReportManagers.get(tid);
if (employeeReportManager==null) {
employeeReportManager=new EmployeeReportManager();
employeeReportManagers.put(tid, employeeReportManager);
}
return employeeReportManager;
}
} /**
* ReportManagerFactoryTest
* @Description 享元模式测试类
*/
public class ReportManagerFactoryTest {
@Test
public void testCreateReport() {
ReportManagerFactory factory=new ReportManagerFactory();
IReportManager reportManager1=factory.getEmployeeReportManager("a");
IReportManager reportManager2=factory.getEmployeeReportManager("a");
IReportManager reportManager3=factory.getEmployeeReportManager("a");
IReportManager reportManager4=factory.getFinancialReportManager("a");
IReportManager reportManager5=factory.getFinancialReportManager("a");
IReportManager reportManager6=factory.getFinancialReportManager("a");
System.out.println(reportManager1.createReport());
System.out.println(reportManager2.createReport());
System.out.println(reportManager3.createReport());
System.out.println(reportManager4.createReport());
System.out.println(reportManager5.createReport());
System.out.println(reportManager6.createReport());
}
}

    2.1.4 装饰模式

/**
* IPacketCreator
* @Description 内容处理接口
*/
public interface IPacketCreator {
public String handContent();
} /**
* PacketCreator
* @Description 内容处理具体实现
*/
public class PacketCreator implements IPacketCreator {
@Override
public String handContent() {
return "装饰模式";
}
} /**
* PacketDecorator
* @Description 装饰器
*/
public abstract class PacketDecorator implements IPacketCreator {
IPacketCreator packetCreator;
public PacketDecorator(IPacketCreator packetCreator) {
this.packetCreator = packetCreator;
}
} /**
* PacketHtmlDecorator
* @Description 功能详细描述
*/
public class PacketHtmlDecorator extends PacketDecorator {
public PacketHtmlDecorator(IPacketCreator packetCreator) {
super(packetCreator);
}
@Override
public String handContent() {
StringBuffer buffer=new StringBuffer("<html>");
buffer.append(packetCreator.handContent()).append("</hmtl>");
return buffer.toString();
}
} /**
* DecoratorTest
* @Description 装饰模式测试类
*/
public class DecoratorTest {
@Test
public void decoratorTest() {
String content=new PacketHtmlDecorator(new PacketCreator()).handContent();
System.out.println(content);
}
}

  2.2 使用缓冲区提高性能

    尽量使用含有缓冲区的类进行操作,如stringBuffer,BufferInputStream等

  2.3 使用缓冲技术提升性能

    1.使用oscache缓存jsp局部缓冲

     1.1 导入oscache的相关jar包

<dependency>
<groupId>opensymphony</groupId>
<artifactId>oscache</artifactId>
<version>2.4.1</version>
</dependency>

     1.2 将oscache.properties文件放入到resource目录下

     1.3 在jsp页面中导入lib文件  <%@taglib prefix="oscache" uri="http://www.opensymphony.com/oscache" %>

     1.4 将需要缓存的代码使用<oscache:cache></oscache:cache>标签进行包裹

<oscache:cache key="${param.refresh }"  refresh="${param.refresh }">
<div>登录时间<%=new Date() %></div>
</oscache:cache>

    2.使用oscache全局缓冲

     2.1 在web.xml配置oscacheFilter过滤器  

<filter>
<filter-name>oscacheFilter</filter-name>
<filter-class>com.opensymphony.oscache.web.filter.CacheFilter</filter-class>
<init-param>
<param-name>time</param-name>
<param-value>600</param-value>p
</init-param>
<init-param>
<param-name>scope</param-name>
<param-value>application</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>oscacheFilter</filter-name>
  <!--缓存的路径-->
<url-pattern>*.jsp</url-pattern>
</filter-mapping>

  

      

java性能调优01的更多相关文章

  1. Java性能调优笔记

    Java性能调优笔记 调优步骤:衡量系统现状.设定调优目标.寻找性能瓶颈.性能调优.衡量是否到达目标(如果未到达目标,需重新寻找性能瓶颈).性能调优结束. 寻找性能瓶颈 性能瓶颈的表象:资源消耗过多. ...

  2. Java性能调优(一):调优的流程和程序性能分析

     https://blog.csdn.net/Oeljeklaus/article/details/80656732 Java性能调优 随着应用的数据量不断的增加,系统的反应一般会越来越慢,这个时候我 ...

  3. Java性能调优:利用JMC分析性能

    Java性能调优作为大型分布式系统提供高性能服务的必修课,其重要性不言而喻. 好的分析工具能起到事半功倍的效果,利用分析利器JMC.JFR,可以实现性能问题的准确定位. 本文主要阐述如何利用JMC分析 ...

  4. Java性能调优:利用JFR生成性能日志

    Java性能调优作为大型分布式系统提供高性能服务的必修课,其重要性不言而喻. 好的分析工具能起到事半功倍的效果,利用分析利器JMC.JFR,可以实现性能问题的准确定位. 本文主要阐述如何利用JFR生成 ...

  5. 第六章 Java性能调优工具(待续)

    Java性能调优工具 Windows工具 JDK命令行工具 JConsole工具 Visual VM多合一工具 Visual VM对QQL的支持 MAT内存分析工具 MAT对QQL的支持 JProfi ...

  6. java 性能调优和GC

    JAVA 性能调优和GC http://blog.csdn.net/gzh0222/article/details/7663181 JAVA GC调优手记 http://blog.csdn.net/f ...

  7. Java性能调优概述

    目录 Java性能调优概述 性能优化有风险和弊端,性能调优必须有明确的目标,不要为了调优而调优!!!盲目调优,风险远大于收益!!! 程序性能的主要表现点 执行速度:程序的反映是否迅速,响应时间是否足够 ...

  8. Java性能调优攻略全分享,5步搞定!(附超全技能图谱)

    对于很多研发人员来说,Java 性能调优都是很头疼的问题,为什么这么说?如今,一个简单的系统就囊括了应用程序.数据库.容器.操作系统.网络等技术,线上一旦出现性能问题,就可能要你协调多方面组件去进行优 ...

  9. Java性能调优实战,覆盖80%以上调优场景

    Java 性能调优对于每一个奋战在开发一线的技术人来说,随着系统访问量的增加.代码的臃肿,各种性能问题便会层出不穷. 日渐复杂的系统,错综复杂的性能调优,都对Java工程师的技术广度和技术深度提出了更 ...

随机推荐

  1. Dubbo 系列(07-5)集群容错 - Mock

    Dubbo 系列(07-5)集群容错 - Mock [toc] Spring Cloud Alibaba 系列目录 - Dubbo 篇 1. 背景介绍 相关文档推荐: Dubbo 实战 - 服务降级 ...

  2. Apache Shiro 会话+缓存+记住我(三)

    1.会话管理SessionDao和SessionManager 1)安装Redis 2)依赖 <dependency> <groupId>redis.clients</g ...

  3. 在Emacs中使用plantuml画UML图

    在Emacs中使用plantuml画UML图 */--> code {color: #FF0000} pre.src {background-color: #002b36; color: #83 ...

  4. redis缓存架构-01-缓存架构方案

    缓存实现架构 1.小型电商-页面静态化(基于url rewrite) 2.大型电商

  5. UVA 12446 How Many... in 3D! ( 递推 + 树状数组 )

    C. How Many... in 3D! Time Limit: 1000ms Memory Limit: 131072KB 64-bit integer IO format: %lld      ...

  6. 【置顶】CSP/S 2019退役祭

    标题没错,今年就是我的最后一年了. 才高一啊,真不甘心啊. DAY1(之前的看前几篇博客吧) T1 现在没挂 T2 貌似是树形DP,跑到80000的深度时挂了,于是特判了链的情况,大样例过了,现在没挂 ...

  7. CentOS使用手册(三)

    前言: 目录:暂时不写,因为有些实验,比如负载均衡,反向代理,配置ssl等实验来不及做.所以这篇随笔还需日后补充(排版以后慢慢调,现在该做平台分析系统了) Linux中Mongodb4.x安装调试.远 ...

  8. HDFS学习笔记一

    一,HDFS是什么,HDFS有什么用,HDFS怎么用 HDFS:Hadoop Distribute File System 分布式文件系统 HDFS可以保证文件存储的可靠性, 二.HDFS的设计原则 ...

  9. Spring MVC 配置Controller详解

    在SpringMVC中,对于Controller的配置方式有很多种,如下做简单总结 第一种 URL对应Bean如果要使用此类配置方式,需要在XML中做如下样式配置: <!-- 表示将请求的URL ...

  10. numpy 数组中添加新元素

    import numpy as npnew_array = np.empty(shape=[0, 3]) # 3列n行for i in range(10): x = i+1 y = i+2 z = i ...