JAVA中性能优化的几种有效措施(数据库优化,前端优化,锁利用)

本文分享了作者在工作中积累的前端及后端Java性能优化措施,包括前端资源合并、压缩技术,后端单例模式应用、线程池管理、锁竞争减少、结果缓存等策略,以及数据库层面的索引优化、反范式设计等方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

     众所周知,java入门容易,精通难,在刚毕业或者刚入行,你只能做一些简单的CRUD操作,领导是不会也不敢给你机会做复杂的事情,所以有些东西得通过自己的思考学习,但是第三年之后,你就能接触到稍微核心的技术,如何处理高并发,如何进行系统优化等等,通过查阅书籍或者通过工作经验,加上自己的思考,能够快速的成长起来,下面我就说一下我自己在工作中用到的一些性能优化措施(有些是我查阅专业书籍得到的经验)

 

前端方面:

    1:前端优化:我们都知道http请求会消耗网络带宽,并且大部分请求和响应包含很多相同的header和cookie内容,所以减少http请求后台的数量能够加速页面的加载,通过采取合并样式和脚本文件等措施,来减少页面加载所需要的请求数量.

     2:使用压缩:对于前端样式文件和脚本文件,可以将其中的空格,注释等不必要的字符去掉,通过gzip业所来减少网络上传输的字节数,从而来达到性能优化的目的

后端java程序优化:

     1:使用单例模式,饿汉式:类加载时创建实例,私有化构造函数,对外提供统一的get方法来得到该对象,从而来达到对这些实例创建的限制

      2:future模式(书上学的,实际中未用到):一个任务执行起来需要时间,为了节省等待的时间,可以先获取futuretask类,然后继续处理别的人任务,ra当任务执行完毕后,用futuretask来提取结果FutureTask futuretask = new FutureTask (new job()),开启新线程来运行FutureTask ,运行完毕后,futuretask.get()来提取运行结果

      3:线程池:线程创建和销毁会销毁一定的系统资源,那我们就可以使用线程池,可以避免因过多线程导致的内存溢出,任务执行完毕后,线程还能重用,减少了创建和销毁的消耗,比如:创建一个固定大小为10的线程池:ExecutorService exec = Executors.newFixedThreadPool(10),其中exec就是创建的线程池,

     4:降低锁竞争:锁的竞争会使得更多的线程等待,本来并行的操作变为串行,降低系统的运行速度,降低锁竞争的方式是尽可能的缩短锁持有的时间,比如讲一部分与锁无关的代码移出同步代码块,特别是开销特别大的操作,另一种是减少锁的粒度,将原先使用独锁来保护的多个变量变为多个相互独立的锁来分别保护,降低线程 请求锁的几率,但是这样操作,会使锁的数量增加,发生死锁的风险也越高,另一种是放弃使用独占锁,比如使用读写锁,读操作不会占用公共资源,所以不需要枷锁,但是写入操作必须获得独占的锁,所以对于多读少写的情况,使用读写锁比使用独占锁能提供更高的并发数量

     5:结果缓存:对于相同的用户请求,可以将结果缓存到本地内存,或通过分布式缓存来进行结果的缓存,可以节约宝贵的CPU计算资源,减少与数据库的交互次数

    6:数据库查询优化:

        (1):合理使用索引:索引的本质就是新华字典中的目录,可以通过目录,快速找到数据,避免进行全表扫描,在设计sql语句时,尽量不适用模糊查询,因为采取模糊查询时,索引将会失效,将对全表进行扫描,降低性能,如果无法避免,可以搭建全文检索系统来支持模糊查询的功能,还有当查询的列不是独立的,而是表达式或者函数的一部分时,将无法使用该列的索引,对数据进行全表扫描;对多列索引建立组合索引可以避免索引合并给数据库带来的开销;对于使用b树和b+树的存储的组合索引来说,有最左前缀的原则,意思就是如果不是按照组合索引的最左列来开始查询,则无法使用组合索引,

       (2):反范式设计:关系型数据中提出的范式设计,要求在表的设计中,尽可能较少数据冗余,反范式设计就是讲一些常用的需要关联查询的列进行冗余存储,从而减少表关联带来的全表扫描,但是同时增加了更新的成本和存储成本

       (3):使用查询缓存:mysql会将select查询的结果缓存到内存中,下次查询时,直接返回结果,通过修改mysql的配置文件来配置缓存的大小和阈值:query_cache_type:如果为1,则查询缓存开启,query_cache_size表示总的缓存空间的大小,16MB,query_cache_limit:最大能缓存记录集的大小

       (4):使用搜索引擎:我项目中用到的solr,关于solr服务器搭建,使用我就不详细说了,大家可以自行百度

       (5):使用key_value数据库:现在的互联网企业,都有海量的数据,对于这种情况,多表的关联查询非常损耗性能,我们可以使用key_value数据库来讲数据进行扁平化存储,适合存储非结构化数据,所有的数据都只有一个索引,就是key,用到的是redis数据库

       (6):硬件性能优化:这个不必说,就是用钱砸,内存越大越好,cpu的核数尽可能多,同时可以使用intel的超线程技术,以提高系统的多任务处理能力

 

好了,说了这么多我在工作中使用到的性能优化方面的技术,欢迎各位小伙伴私信我,我们一起探讨,一起学习进步,三人行,必有我师焉,今天是教师节,祝天下所有老师节日快乐

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值