java大数据量调优(超赞值得收藏)(大数据jvm调优)
mhr18 2024-09-29 14:16 27 浏览 0 评论
从总体上来看,对于大型网站,比如门户网站,在面对大量用户访问、高并发请求方面,基本的解决方案集中在这样几个环节:
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:故障诊断、性能监控。
最主要的是给自己增加知识的储备,有备无患。最后给大家分享Spring系列的学习笔记和面试题,包含spring面试题、spring cloud面试题、spring boot面试题、spring教程笔记、spring boot教程笔记、最新阿里巴巴开发手册(63页PDF总结)、2022年Java面试手册。一共整理了1184页PDF文档。私信博主(666)领取,祝大家更上一层楼!!!
相关推荐
- 经典技术干货分享:JVM内存模型和垃圾回收机制
-
来源:全栈工程师小辉JVM内存模型根据Java虚拟机规范,Java数据区域分为五大数据区域。其中方法区和堆是所有线程共享的,虚拟机栈、本地方法栈和程序计数器则为线程私有的。有的博客称方法区是永久代...
- 让我来告诉你:最重要的 JVM 参数总结
-
1.概述在本篇文章中,你将掌握最常用的JVM参数配置。如果对于下面提到了一些概念比如堆、#2.堆内存相关Java虚拟机所管理的内存中最大的一块,Java堆是所有线程共享的一块内存区域,在虚拟机...
- 说一下 JVM 的内存布局和运行原理?
-
JVM(JavaVirtualMachine,Java虚拟机)顾名思义就是用来执行Java程序的“虚拟主机”,实际的工作是将编译的class代码(字节码)翻译成底层操作系统可以运行的机器...
- 这些不可不知的JVM知识,我都用思维导图整理好了
-
VM是面试中必问的部分,本文通过思维导图以面向面试的角度整理JVM中不可不知的知识。先上图:JVM必备知识1、JVM基本概念1.1、JVM是什么JVM的全称是「JavaVirtualMachi...
- 认识Kotlin_了解Kotlin和JVM虚拟机关系_重要性_更强大的跨平台
-
1.谷歌支持Kotlin作为android第一开发语言,因为java是已经被oracle收购了,可能会对Google收费.2.可以看到java语言写的android程序,实际上回编译成字节码,在jvm...
- 美团一面:为什么线程崩溃崩溃不会导致 JVM 崩溃
-
网上看到一个很有意思的美团面试题:为什么线程崩溃崩溃不会导致JVM崩溃,这个问题我看了不少回答,但发现都没答到根上,所以决定答一答,相信大家看完肯定会有收获,本文分以下几节来探讨线程崩溃,进程一定...
- 一篇文章掌握整个JVM,JVM超详细解析!!!
-
不懂JVM看完这一篇文章你就会非常懂了,文章很长,非常详细!!!先想想一些问题1我们开发人员编写的Java代码是怎么让电脑认识的首先先了解电脑是二进制的系统,他只认识01010101比如我们经常要...
- Java反射机制最全详解(图文全面总结)
-
Java反射是各种框架以及中间件实现的基石,也是大厂面试重点考察内容,下面全面来详解Java反射机制@mikechen本篇已收于mikechen原创超30万字《阿里架构师进阶专题合集》里面。Java反...
- OCP 专家认证培训- 数据库专业人士的进阶阶梯
-
认证简介OCP即Oracle数据库认证专家,是Oracle公司的Oracle数据库DBA(DatabaseAdministrator数据库管理员)认证课程。通过该认证,表明持证人能...
- 《塞尔达传说》进化史!一口气看完全部塞尔达传说!
-
《塞尔达传说》系列全版本历史回顾以下是塞尔达传说系列所有官方游戏版本的完整列表,按时间顺序排列:主要正统系列作品1、《塞尔达传说》/TheLegendofZelda(1986)《塞尔达传说》是...
- Linux文件系统结构全解析(linux文件系统概述)
-
对Linux新手而言,“一切皆文件”的设计哲学常让人既兴奋又困惑——打开终端输入ls/,看到的bin、etc、var等目录到底有什么用?如何快速定位关键文件?本文将从Linux文件系统的底层逻...
- 一文带您了解数据库的行列之争:行式与列式存储的异同
-
数据库存储格式是数据库管理系统中一个至关重要的方面,它直接影响到数据的组织和检索效率。在数据库中,有两种主要的存储格式,即行式存储和列式存储。这两者采用截然不同的方法来组织和存储数据,各自具有一系列优...
- NL2SQL(三)开源项目怎么选:talk is cheap, show me the code!
-
老规矩,先看效果下面的demo来自试用的SuperSonic,将会在下面详细介绍:大模型时代Text-to-SQL特点随着基于LLM技术的发展,RAG/AIAgent/Fine...
- JDK25长期支持版九月降临:18项王炸功能全解析
-
Java要放大招啦!9月份推出的JDK25长期支持版已经锁定18个超能力,从稳定值到结构化并发,还有Linux系统下的"预知未来"性能分析!下面我用打游戏的术语给你们掰扯明白:1、飞...
- OceanBase 推出单机版 高度兼容MySQL和Oracle
-
【环球网科技综合报道】3月27日,独立数据库厂商OceanBase正式发布单机版产品。据悉,这一产品基于自主研发的单机分布式一体化架构设计,具备极简数据库架构和高度兼容性,为中小规模业务提供兼具性能与...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- oracle位图索引 (74)
- oracle批量插入数据 (65)
- oracle事务隔离级别 (59)
- oracle 空为0 (51)
- oracle主从同步 (55)
- oracle 乐观锁 (51)
- redis 命令 (78)
- php redis (88)
- redis 存储 (66)
- redis 锁 (69)
- 启动 redis (66)
- redis 时间 (56)
- redis 删除 (67)
- redis内存 (57)
- redis并发 (52)
- redis 主从 (69)
- redis 订阅 (51)
- redis 登录 (54)
- redis 面试 (58)
- 阿里 redis (59)
- redis 搭建 (53)
- redis的缓存 (55)
- lua redis (58)
- redis 连接池 (61)
- redis 限流 (51)