从总体上来看,对于大型网站,比如门户网站,在面对大量用户访问、高并发请求方面,基本的解决方案集中在这样几个环节:
1.首先需要解决网络带宽和Web请求的高并发,需要合理的加大服务器和带宽的投入,并且需要充分的利用系统中软件、硬件的缓存机制,将能缓存的内容都进行缓存存储,减少计算层和存储层的压力。

2.其次需要对业务服务器和业务支撑服务器进行合理的分层,并且采用并行计算和分布式算法对大量计算进行处理,并且在开发的过程中需要采用Java SDK中并发包(Concurrency)进行编码实现。

3.存储层需要采用分布式文件服务器和列式的存储服务器进行构建,支撑海量数据的存放和读取,并且还要对关系型数据进行深层次的配置参数优化。

4.我们还需要清楚的认识到,将来根据系统运行的状态以及平台中不同的业务场景循序渐进的进行调整和优化。

对于大型系统来说,采用的技术是涉及面非常广,从硬件到软件、编程语言、数据库、WebServer、防火墙等各个领域都有了很高的要求。在面对大量用户访问、高并发请求方面,基本的解决方案集中在这样几个环节:将会使用高性能的服务器、高性能的数据库、高效率的编程语言、还有高性能的Web容器。但是除了这几个方面,还没法根本解决面临的高负载和高并发问题,所以需要将计算和负载的压力分载到每个计算机上,使用不同的服务器集群机组进行分布式和并行计算,面对所产生的压力。

具体每个环节的一些常用手段:

一、应用服务器负载均衡 
1、链路负载均衡 
  通过DNS解析域名时,将客户端的访问解析成不同的IP,分配到不同的入口,同时尽可能保证所访问的入口是所有入口中可能较快的一个。 
2、软件负载均衡 
  访问时生成页面的任务会被分配给其中一台服务器完成,这个过程要保证公正、公平、平均。软件四层交换我们可以使用Linux上常用的LVS来解决,LVS就是Linux Virtual Server。 
3、硬件负载均衡

  第四层交换使用第三层和第四层信息包的报头信息,根据应用区间识别业务流,将整个区间段的业务流分配到合适的应用服务器进行处理。在第四层交换中的应用区间则由源端和终端IP地址、TCP和UDP端口共同决定。在硬件四层交换产品领域,有一些知名的产品可以选择,比如Alteon、F5等。

最新:CDN加速技术。CDN的全称是内容分发网络。其目的是通过在现有的Internet中增加一层新的网络架构,将网站的内容发布到最接近用户的网络“边缘”,使用户可以就近取得所需的内容,提高用户访问网站的响应速度。

二、图片服务器分离

对于Web服务器来说,不管是Apache、IIS还是其他容器,图片是最消耗资源的,于是我们有必要将图片与页面进行分离,这是基本上大型网站都会采用的策略,他们都有独立的、甚至很多台的图片服务器。这样的架构可以降低提供页面访问请求的服务器系统压力,并且可以保证系统不会因为图片问题而崩溃。在应用服务器和图片服务器上,可以进行不同的配置优化,比如apache在配置ContentType的时候可以尽量少支持、尽可能少的LoadModule,保证更高的系统消耗和执行效率。

三、页面优化 
1、减少请求次数 
  通过合并CSS和Javascript文件来减少请求次数或是将资源文件分布在多个域名下来绕过浏览器并发加载的限制。 
2、压缩CSS和Javascript代码。 
  通过对文件代码内容删除换行和空格来减少代码存储空间。 
3、优化图片 
  通过对图片进行截取和缩放大小来优化图片,加快图片加载速度。 
4、HTML静态化 
  利用FreeMarker将数据库数据静态化成html文件来提高访问速度。适用场合:对于含有不要求实时性的内容的网页可使用,如网站首页,各模块首页的新闻,公告等等。

四、Java设计优化 
1、设计模式 
  单例模式、代理模式、享元模式、装饰者模式、观察者模式。 
2、缓存 
  如:使用Ehcache可以结合AOP,做业务层的方法缓存,以类名、方法名、参数名作为key,结果对象作为value。适用场合:对数据不经常更新,查询方式比较固定。 
3、缓冲 
  如:JDK的IO包中BufferedWriter 
4、多线程 
  适用场合:群发邮件,大批量处理图片,写日志。典型的消费者生产者模式 
5、对象池 
  如:数据库连接池C3P0、线程池Executors、Apache的对象池Jakarta Commons Pool 
6、分布式缓存 
  分布式缓存框架Terracotta,可实现分布式session、EhCachc等共享。

五、Java程序编码优化 
1、String 
  String的replace、substring方法会有内存泄露问题,用StringTokenizer取代split方法,charAt方法代替startsWith、endsWith方法,StringBuilder取代String并初始化预估的capacity。 
2、List 
  查询优先使用ArrayList,插入删除优先使用LinkedList。如果插入数据在数组最后一位,则ArrayList性能好于LinkedList。

  遍历实现了RandomAccess接口的集合性能由高到低依次排序:索引下标>迭代器>增强for 
3、Map 
  map对象里key值的hashCode方法决定集合的性能。 
4、优化集合访问代码 
  创建集合对象时,初始化预估的capacity可提高性能。尽量使用内部元素来取代方法调用。 
5、NIO 
  使用MappedByteBuffer来取代传统IO来进行文件读写。 
6、引用 
  在适当时候缓存可以用弱引用或是软引用来实现,如:WeakHashMap。 
7、异常 
  尽量避免在循环体内使用异常捕获。 
8、位运算代替乘除运算

六、数据库优化 
1、分表 
  通过对记录ID取模或时间维度的规则进行分表。 
2、分区 
  Oracle数据库支持分区,可以根据某个列的数据规则进行分区。 
3、中间表 
  将原数据根据想得到的目标数据进行一系列的处理做出一套中间表,直接从中间表中进行查询,通过定时调度定时更新中间表。适用场合:对数据内容实时性要求不高,如:数据分析。 
4、历史归档 
  可根据时间整理出很少用到的数据集抽到历史表中,数据表只留常用数据,可以利用对象序列化反序列化来实现。适用场合:对历史数据极少访问。 
5、列式存储 
  MySQL开源数据仓库Infobright,对高压缩比数据存储,查询速度可提高5~60倍,免费版不支持DML语句,不支持高并发,只能支持10多个并发查询,可通过load导入csv数据文件。适用场合:对数据不经常更新并且实时性要求不高,如:数据分析。 
6、查询缓存 
  MySQL Query Cache,Oracle Result Cache,可通过修改数据库配置文件来实现查询缓存,sql语句作为key,结果作为value的缓存方式,当数据表发生改变时相应的cache就会失效。适用场合:对数据不经常更新,查询方式比较固定。注:支持表连接,但不支持函数 
7、建索引 
  对于使用较复杂的sql,对大数据量表查询时候,可采用建索引的方式,将涉及到的查询条件字段,可提高查询速度。 
8、sql优化 
  sql语句中,select后尽量明确字段名来代替*来减少查询列。尽量少使用in关键字,可通过left join和exists关键字取代。 
9、存储过程 
  存储过程只需编译一次,适用场合:当对数据库进行复杂操作时。如:多表的查询,计算,更新。 
10、数据库服务器集群,读写分离。

七、JVM调优。 
1、确定堆内存大小(-Xmx、-Xms)。 
2、合理分配新生代和老年代(-XX:NewRatio、-Xmn、-XX:SurvivorRatio)。 
3、确定永久区大小(-XX:Permsize、-XX:MaxPermSize)。 
4、选择垃圾收集器(CMS、G1等)、对垃圾收集器合理设置。 
5、禁用显示GC(-XX:+DisableExplicitGC)。 
6、禁用类元数据回收(-Xnoclassgc)。 
7、禁用类验证(-Xverify:none)。 
8、JVM增加内存参数-Xms256M -Xmx1024M  -XX:MaxNewSize=512m -XX:MaxPermSize=512m

七、需求上解决:如果性能瓶颈的模块的需求是可有可无,可以考虑屏蔽掉此需求。 

八、性能调优工具 
1.JMeter、LoadRunner:性能测试、压力测试。 
2.JConsole、JProfiler:监控堆信息、线程、永久区使用情况、类加载情况等。 
3.Visual VM:故障诊断、性能监控。

java大数据量调优的更多相关文章

  1. 大数据性能调优之HBase的RowKey设计

    1 概述 HBase是一个分布式的.面向列的数据库,它和一般关系型数据库的最大区别是:HBase很适合于存储非结构化的数据,还有就是它基于列的而不是基于行的模式. 既然HBase是采用KeyValue ...

  2. java 导出Excel 大数据量,自己经验总结!

    出处: http://lyjilu.iteye.com/ 分析导出实现代码,XLSX支持: /** * 生成<span style="white-space: normal; back ...

  3. 大数据量查询优化——数据库设计、SQL语句、JAVA编码

    数据库设计方面: 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将 ...

  4. java excel大数据量导入导出与优化

    package com.hundsun.ta.utils; import java.io.File; import java.io.FileOutputStream; import java.io.I ...

  5. java处理大数据量任务时的可用思路--未验证版,具体实现方法有待实践

    1.Bloom filter适用范围:可以用来实现数据字典,进行数据的判重,或者集合求交集基本原理及要点:对于原理来说很简单,位数组+k个独立hash函数.将hash函数对应的值的位数组置1,查找时如 ...

  6. [java] JVM监控与调优

    原文出处:http://www.cnblogs.com/zhguang/p/java-jvm-gc.html   光说不练假把式,学习Java GC机制的目的是为了实用,也就是为了在JVM出现问题时分 ...

  7. 【Spark篇】---Spark调优之代码调优,数据本地化调优,内存调优,SparkShuffle调优,Executor的堆外内存调优

    一.前述 Spark中调优大致分为以下几种 ,代码调优,数据本地化,内存调优,SparkShuffle调优,调节Executor的堆外内存. 二.具体    1.代码调优 1.避免创建重复的RDD,尽 ...

  8. Spark学习之路 (九)SparkCore的调优之数据倾斜调优

    摘抄自:https://tech.meituan.com/spark-tuning-pro.html 数据倾斜调优 调优概述 有的时候,我们可能会遇到大数据计算中一个最棘手的问题——数据倾斜,此时Sp ...

  9. Spark(十)Spark之数据倾斜调优

    一 调优概述 有的时候,我们可能会遇到大数据计算中一个最棘手的问题——数据倾斜,此时Spark作业的性能会比期望差很多.数据倾斜调优,就是使用各种技术方案解决不同类型的数据倾斜问题,以保证Spark作 ...

随机推荐

  1. classLoader和Class.forName的区别

    public class ClassLoaderOrClassForName{ public static void main(String[] args) throws ClassNotFoundE ...

  2. 以太坊上发行ERC20代币

    ERC20 代币生成 环境 虚拟主机: ubuntu 18虚拟机 宿主主机: win10; ip:192.168.0.160 1.部署以太坊 1.1 安装GO 安装go,并编译geth 将下载好的go ...

  3. crontab下git命令无效

    原因 crontab默认的 path  设置和系统自身的有区别 git 命令放在 /usr/local/bin/ 目录 whereis git 而crontab 却在  /sbin:/bin:/usr ...

  4. 个人项目cpu占用图

  5. 【EMV L2】2CS.001.00 ~ 2CS.007.00

    测试case要求,对于T=0和T=1卡,命令中是否存在Le是有差异的: - Select: Mandatory Command00 A4 04 00 Lc Command Data LeLc = 05 ...

  6. Hailstone冰雹序列问题

    在复习数据结构,课程中提到Hailstone冰雹序列问题,问题如下 代码如下: public List<int> Hailstone(int n) { List<int> li ...

  7. ArcMap复制粘贴问题

    ArcMap 10.2能进行复制,但是不能进行粘贴的问题: 前几天用朋友的ArcMap10.2时,偶然发现在编辑数据的时候,需要在不同的shp层之间操作,往往有时候可以复制,但是粘贴那一项是灰色的,经 ...

  8. 博客作业06--结构体&指针

    1.本章学习总结 1.1思维导图 1.2.本章学习体会 结构体突破了数组的局限,把不同类型有内在联系的数据汇聚成一个整体,这种新的构造数据类型,提供了更便利的手段,更好的实现代码功能.通过代码建立文件 ...

  9. postman Could not get any response。

    浏览器输入地址可以返回结果,但是由于返回的json没有格式,看起来比较麻烦,用postman却报错Could not get any response. 可以注意到下面写了可能的情况:比如服务器无响应 ...

  10. spring定时器cron

    关于cron表达式(参考资料):Cron 表达式包括以下 7 个字段: 秒 分 小时 月内日期 月 周内日期 年(可选字段) 特殊字符Cron 触发器利用一系列特殊字符,如下所示: 反斜线(/)字符表 ...