Java性能优化的七个方向

IT科技2025-11-05 07:09:324

了解了优化目标后,优化那接下来应该从哪些方面入手呢?优化本文主要侧重于理论分析,我们从整体上看一下 Java 性能优化都有哪些可以遵循的优化规律。本文主讲理论。优化关于实践,优化后续的优化文章会用较多的案例来细化本文的知识点,适合反复思考和归纳。优化

性能优化根据优化的优化类别,分为业务优化和技术优化。优化 业务优化产生的优化效果也是非常大的,但它属于产品和管理的优化范畴。 同作为程序员,优化在平常工作中,优化我们面对的优化优化方式,主要是优化通过一系列的技术手段,来完成对既定的优化目标。 这一系列的技术手段,我大体归纳为如图以下 7 类:

可以看到,优化方式集中在对计算资源和存储资源的规划上。WordPress模板优化方法中有多种用空间换时间的方式,但只照顾计算速度,而不考虑复杂性和空间问题,也是不可取的。我们要做的,就是在照顾性能的前提下,达到资源利用的最优状态。

接下来,我简要介绍一下这7个优化方向。 如果你感觉比较枯燥,那也没关系,我们本文的目的,就是让你的脑海里有一个总分的概念,以及对理论基础有一个整体的认识。

1、复用优化

在写代码的时候,你会发现有很多重复的代码可以提取出来,做成公共的企商汇方法。这样,在下次用的时候,就不用再费劲写一遍了。

这种思想就是复用。上面的描述是编码逻辑上的优化,对于数据存取来说,有同样的复用情况。无论是在生活中还是编码中,重复的事情一直在发生,如果没有复用,工作和生活就会比较累。

在软件系统中,谈到数据复用,我们首先想到的就是缓冲和缓存。注意这两个词的区别,它们的意义是完全不同的,很多同学很容易搞混,香港云服务器在这里简单地介绍一下。

缓冲(Buffer),常见于对数据的暂存,然后批量传输或者写入。多使用顺序方式,用来缓解不同设备之间频繁地、缓慢地随机写,缓冲主要针对的是写操作。

缓存(Cache),常见于对已读取数据的复用,通过将它们缓存在相对高速的区域,缓存主要针对的是读操作。

与之类似的,是对于对象的池化操作,比如数据库连接池、线程池等,在 Java 中使用得非常频繁。由于这些对象的创建和销毁成本都比较大,我们在使用之后,也会将这部分对象暂时存储,下次用的时候,就不用再走一遍耗时的初始化操作了。

2、 计算优化

并行执行

现在的 CPU 发展速度很快,绝大多数硬件,都是多核。要想加快某个任务的执行,最快最优的解决方式,就是让它并行执行。并行执行有以下三种模式。

第一种模式是多机,采用负载均衡的方式,将流量或者大的计算拆分成多个部分,同时进行处理。 比如,Hadoop 通过 MapReduce 的方式,把任务打散,多机同时进行计算。

第二种模式是采用多进程。 比如 Nginx,采用 NIO 编程模型,Master 统一管理 Worker 进程,然后由 Worker 进程进行真正的请求代理,这也能很好地利用硬件的多个 CPU。

第三种模式是使用多线程,这也是 Java 程序员接触最多的。 比如 Netty,采用 Reactor 编程模型,同样使用 NIO,但它是基于线程的。 Boss 线程用来接收请求,然后调度给相应的 Worker 线程进行真正的业务计算。

像 Golang 这样的语言,有更加轻量级的协程(Coroutine),协程是一种比线程更加轻量级的存在,但目前在 Java 中还不太成熟,就不做过多介绍了,但本质上,它也是对于多核的应用,使得任务并行执行。

变同步为异步

再一种对于计算的优化,就是变同步为异步,这通常涉及编程模型的改变。同步方式,请求会一直阻塞,直到有成功,或者失败结果的返回。虽然它的编程模型简单,但应对突发的、时间段倾斜的流量,问题就特别大,请求很容易失败。

异步操作可以方便地支持横向扩容,也可以缓解瞬时压力,使请求变得平滑。同步请求,就像拳头打在钢板上;异步请求,就像拳头打在海绵上。你可以想象一下这个过程,后者肯定是富有弹性的,体验更加友好。

惰性加载

最后一种,就是使用一些常见的设计模式来优化业务,提高体验,比如单例模式、代理模式等。举个例子,在绘制 Swing 窗口的时候,如果要显示比较多的图片,就可以先加载一个占位符,然后通过后台线程慢慢加载所需要的资源,这就可以避免窗口的僵死。

3、结果集优化

接下来介绍一下对结果集的优化。举个比较直观的例子,我们都知道 XML 的表现形式是非常好的,那为什么还有 JSON 呢?除了书写要简单一些,一个重要的原因就是它的体积变小了,传输效率和解析效率变高了,像 Google 的 Protobuf,体积就更小了一些。虽然可读性降低,但在一些高并发场景下(如 RPC),能够显著提高效率,这是典型的对结果集的优化。

这是由于我们目前的 Web 服务,都是 C/S 模式。 数据从服务器传输到客户端,需要分发多份,这个数据量是急剧膨胀的,每减少一小部分存储,都会有比较大的传输性能和成本提升。

像 Nginx,一般都会开启 GZIP 压缩,使得传输的内容保持紧凑。 客户端只需要一小部分计算能力,就可以方便解压。 由于这个操作是分散的,所以性能损失是固定的。

了解了这个道理,我们就能看到对于结果集优化的一般思路,你要尽量保持返回数据的精简。 一些客户端不需要的字段,那就在代码中,或者直接在 SQL 查询中,就把它去掉。

对于一些对时效性要求不高,但对处理能力有高要求的业务。 我们要吸取缓冲区的经验,尽量减少网络连接的交互,采用批量处理的方式,增加处理速度。

结果集合很可能会有二次使用,你可能会把它加入缓存中,但依然在速度上有所欠缺。 这个时候,就需要对数据集合进行处理优化,采用索引或者 Bitmap 位图等方式,加快数据访问速度。

4、资源冲突优化

我们在平常的开发中,会涉及很多共享资源。这些共享资源,有的是单机的,比如一个 HashMap;有的是外部存储,比如一个数据库行;有的是单个资源,比如 Redis 某个 key 的Setnx;有的是多个资源的协调,比如事务、分布式事务等。

现实中的性能问题,和锁相关的问题是非常多的。大多数我们会想到数据库的行锁、表锁、Java 中的各种锁等。在更底层,比如 CPU 命令级别的锁、JVM 指令级别的锁、操作系统内部锁等,可以说无处不在。

只有并发,才能产生资源冲突。也就是在同一时刻,只能有一个处理请求能够获取到共享资源。解决资源冲突的方式,就是加锁。再比如事务,在本质上也是一种锁。

按照锁级别,锁可分为乐观锁和悲观锁,乐观锁在效率上肯定是更高一些;按照锁类型,锁又分为公平锁和非公平锁,在对任务的调度上,有一些细微的差别。

对资源的争用,会造成严重的性能问题,所以会有一些针对无锁队列之类的研究,对性能的提升也是巨大的。

5、算法优化

算法能够显著提高复杂业务的性能,但在实际的业务中,往往都是变种。由于存储越来越便宜,在一些 CPU 非常紧张的业务中,往往采用空间换取时间的方式,来加快处理速度。

算法属于代码调优,代码调优涉及很多编码技巧,需要使用者对所使用语言的 API 也非常熟悉。有时候,对算法、数据结构的灵活使用,也是代码优化的一个重要内容。比如,常用的降低时间复杂度的方式,就有递归、二分、排序、动态规划等。

一个优秀的实现,比一个拙劣的实现,对系统的影响是非常大的。比如,作为 List 的实现,LinkedList 和 ArrayList 在随机访问的性能上,差了好几个数量级;又比如,CopyOnWriteList 采用写时复制的方式,可以显著降低读多写少场景下的锁冲突。而什么时候使用同步,什么时候是线程安全的,也对我们的编码能力有较高的要求。

这部分的知识,就需要我们在平常的工作中注意积累,后面的课时中,也会挑比较重要的知识点穿插讲解。

6、高效实现

在平时的编程中,尽量使用一些设计理念良好、性能优越的组件。比如,有了 Netty,就不用再选择比较老的 Mina 组件。而在设计系统时,从性能因素考虑,就不要选 SOAP 这样比较耗时的协议。再比如,一个好的语法分析器(比如使用 JavaCC),其效率会比正则表达式高很多。

总之,如果通过测试分析,找到了系统的瓶颈点,就要把关键的组件,使用更加高效的组件进行替换。在这种情况下,适配器模式是非常重要的。这也是为什么很多公司喜欢在现有的组件之上,再抽象一层自己的;而当在底层组件进行切换的时候,上层的应用并无感知。

7、JVM 优化

因为 Java 是运行在 JVM 虚拟机之上,它的诸多特性,就要受到 JVM 的制约。对 JVM 虚拟机进行优化,也能在一定程度上能够提升 JAVA 程序的性能。如果参数配置不当,甚至会造成 OOM 等比较严重的后果。

目前被广泛使用的垃圾回收器是 G1,通过很少的参数配置,内存即可高效回收。CMS 垃圾回收器已经在 Java 14 中被移除,由于它的 GC 时间不可控,有条件应该尽量避免使用。

JVM 性能调优涉及方方面面的取舍,往往是牵一发而动全身,需要全盘考虑各方面的影响。所以了解 JVM 内部的一些运行原理,还是特别重要的,它有益于我们加深对代码更深层次的理解,帮助我们书写出更高效的代码。

以上就是代码优化的 7 个大方向,我们通过简要的介绍,让大家对性能优化的内容有了大体的了解。这7大方向是代码优化的最主要方向,当然,性能优化还包含数据库优化、操作系统优化、架构优化等其他一些内容,这些不是我们的重点,在后面的文章中,我们也只做简要的介绍。

本文地址:http://www.bzve.cn/news/548b64698805.html
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

热门文章

全站热门

华为电脑桌面设置教程(通过多个桌面设置,让华为电脑更适合你的需求)

好吧,研究了半天终于搞定,和之前的14.04版本安装不一样,因为那种安装方法在此系统下不行,这我就分享一下了。软件名称:搜狗输入法 for Linux 2.0.0.0066 中文官方安装版 64位软件大小:17.8MB更新时间:2015-10-191、首先下载linux版本的某狗安装包吧! 2、我们在结果中点击官方的那个地址进入并下载与你系统位数一致的输入法,我这里是32位的ubuntu,我就下载32位的了!3、下载好后,我们来安装一个工具输入命令: sudo apt-get install gdebi,后按enter执行4、然后,终端会叫你按(Y/N)来决定是否真的安装,我们输入Y,然后按回车键继续。5、安装完成后,我们别关闭终端在终端中继续输入: cd 下载的某狗文件所在目录,我这里就输入:cd 下载,因为我下载的某狗在下载目录。6、进入到你某狗所在的目录后输入:sudo gdebi so 然后按tab键补全搜狗的文件名称按,按enter执行后,等待某狗安装完成。假如期间提示“您是否想要安装这个软件包(Y/N)”,那么你输入“Y”然后按回车键就可以了7、安装完成后,我们点击系统屏幕右上角的那个齿轮图标,然后点击“注销”,注销一下系统,假如无法注销,那么重启一下也可以的。注销完成后,重新进入系统。按“Ctrl+Shift”键切唤出某狗输入法,这样我们就能够使用它了。

先介绍一下环境:虚拟机:debian7.2.0主机: Win7由于有时候无法联网就需要离线安装软件包,可以把debian官网上列出的几个DVD镜像都下下来,其实主要是DVD1,这样就不需要每次安装软件都得联网。下面是我从Debian官网上下下来的DVD镜像:debian-7.2.0-i386-DVD-1debian-7.2.0-i386-DVD-2debian-7.2.0-i386-DVD-3在每张DVD中都有一个README.txt,其中有如下说明:About This Disc ===============   This disc is labeled        Debian GNU/Linux 7.2.0 Wheezy - Official i386 DVD Binary-1        20131012-12:56   which means that this disc is number 1 of a set of 10 discs It contains programs (binaries) for `i386 computers.   The programs on the Binary discs are ordered by popularity. The Binary-1 disc contains the most popular programs and the installation tools; it is possible to install and run Debian with only the Binary-1 disc. The other discs, up to Binary-10, contain mostly special-interest programs.   The Release Notes for wheezy are available on the Debian web site. 在DVD1中有关于Debian的安装手册,中文的手册路径是doc/manual/zh_CN/,其中也有关于DVD安装的介绍CD(和 DVD) 里面包含的软件包按照流行程度排列次序。也就是说,第一张光盘里面是最常用的软件,而最后一张光盘里面包含的是很少有人用到的软件。这也意味着购买或者下载刻录所有 CD 是一种浪费,因为大部分光盘您根本不会用到。多数情况下,只需要使用前 3 到 8 张 CD,然后从网络镜像安装其他要用的软件包。DVD 的情况类似:只要一张,或者前两张 DVD 就能满足您大部分要求。根据经验,常见的桌面安装(使用 GNOME 桌面环境)只需要前三张 CD。其他的桌面环境(KDE 或 Xfce),就需要额外的 CD。而第一张 DVD 就可以轻松地满足所有的三种桌面环境。 下面开始安装:先给虚拟机添加三个虚拟光驱,将刚下载的三个DVD镜像装入如下图所示:(注意:由于已经安装了Debian7.2,所以我把DVD1放在了第二个,即第一IDE控制器从通道,将DVD2放在了第一IDE控制器主通道上,目的是防止每次启动时都自动进入Debian安装界面,DVD1中也有很多软件包)由于添加了三个虚拟光驱,需要修改/etc/fstab,修改为:同时在/media目录下新建一个目录cdrom2,重启后系统就自动把DVD2挂载到/media/cdrom0,将DVD1挂载到/media/cdrom1,将DVD3挂载到/media/cdrom2下面,如下图:挂载好之后,就可以修改/etc/apt/sources.list了,添加如下内容:假如不知道路径后面写什么可以执行 apt-cdrom add,系统会自动搜索cdrom,并自动填写/etc/apt/sources.list文件,可以看他是怎么写的,使用apt-cdrom add这种方法,有事会出现无法找到软件包的问题。最后就可以执行 apt-get update了。

虽然在安装了一个版本后的Ubuntu系统会自带一个显卡驱动,但是显卡驱动是会更新的,这就要涉及到怎么在Ubuntu系统中安装Nvidia显卡驱动了,本文就和大家来探讨一下在Ubuntu系统中安装Nvidia显卡驱动的问题。小编一直用的Ubuntu都是系统自带的默认驱动, 由于分辨率没有任何问题, 所以一直没有安装Nvidia官方的驱动;近期更新到Ubuntu 15.04 之后, 在播放avi 格式的常规视频时却出现闪烁的现象, 而且是一直闪;1.因此考虑是不是显卡驱动需要更新一下, 最初找了很多更新 Nvidia驱动的方法, 写了很多命令,结果都无法安装。一直提示nouveau正在使用中,禁不掉;后来直接用系统内置的源来更新,居然成功了~ 命令如下:sudo apt-get updatesudo apt-get install nvidia-331回车之后会看到很长的列表, 系统自动下载了很多文件, 坐等安装完毕即可;完成后,输入一段命令查看是否安装成功:dpkg -l | grep nvidia假如出现类似下图所示的内容,那就是安装成功了:2.也可以在“系统设置”--“详细信息”中查看显卡驱动的信息, 我给这个Ubuntu分配了30个G的空间, 由于是U盘安装,所以后续还可以通过其他软件扩展空间的容量:Ubuntu15.04 的新桌面, 下方安装了一个docky放置快捷方式。 Ubuntu真是既美观。又好用~ ; 只是需要花一点点时间配置, 未来几年一定会发布集成度更高的Ubuntu, 到时候使用起来会更方便。Ubuntu系统中怎么安装Nvidia显卡驱动就为大家介绍到这里了,希望小编的经验能给大家带来帮助。

莱斯硬盘分区教程(详解莱斯硬盘分区方法,让你的数据有序有力)

升级好ubuntu15.04之后,却发现系统语言全是英文,该怎么设置中文呢,我这就把方法分享给大家。1、点击系统左侧菜单栏中的那个“扳手+齿轮”图标,该图标是打开系统设置的图标。2、打开上面的那个图标后。在第一行,我们使用鼠标左键点击,最后的那个像国旗的图标。它是语言支持图标哦,如下图,打开它。3、打开那个图标之后,点击窗口中,从上到下的第二个图标,我这里是这个界面是中文的,所以,大家知道是在干什么!点击那个位置的按钮就行啦。4、点开后,设置里面有很多语言类型,我们拉动滚动条,来找到我们需要的语言。5、勾选语言列表中的“中文简体”或叫“chinese(simplified)”,然后点击左下角的那个按钮,假如你的此界面和我一样,那么就是点击的应用变更按钮。假如是英文的,勾选然后点击那个位置的按钮即可。6、在弹出的验证窗口里面,我们需要输入密码才能做到系统语言的变更,那么我们输入电脑的密码,然后点击如图中位置的按钮即可。7、我们把在语言支持列表(第一个是English)中的汉语,拉到English上面去,意思是第一个系统语言。然后点击该界面下面的第一个按钮。如下图8、经过以上步骤,我们点击系统右上角的那个齿轮图标,然后再点击里面的“log out ”,即,倒数第三个选项。9、注销一次系统,注销之后,我们重新登陆,是不是系统成为中文的了呢?

电脑剪映字幕遮挡教程(简单易学的剪映字幕遮挡技巧帮你提升视频编辑技能)

由于安装了windows系统,导致Grub出现问题,很多人会选择重装Ubuntu系统,其实完全没有必要,只要将Grub进行修复就可以了,下面小编就给大家带来使用Ubuntu Live CD 修复Grub引导的方法,一起来学习下吧。本文以 Ubuntu Live CD 修复 Grub 引导为例,已在 /dev/sda3 安装 Fedora。首先制作 Ubuntu 启动 USB复制代码代码如下:sudo dd if=ubuntu-13.10-desktop-amd64.iso of=/dev/sdb #/dev/sdb 为 USB 盘符1.使用启动 USB 进入 Ubuntu 试用环境2.查看硬盘分区状况,获取 Linux 系统安装分区编号代码如下:sudo fdisk -l查看输出结果,然后根据文件类型和分区大小来判定 Linux 系统安装在哪块硬盘和安装的分区。我的电脑是在 /dev/sda3 安装了 Fedora。或者,打开 Gparted 图形化工具来查看分区信息也可以。挂载 Fedora 安装分区3.已知 Fedora 安装在了 /dev/sda3 上,所以我们可以用下面命令来挂载 Fedora 安装分区。你需要将 /dev/sda3 换成自己的 Linux 安装分区。代码如下:sudo mount /dev/sda3 /mnt4.挂载其他所需的目录(使用 --bind)代码如下:sudo mount --bind /dev /mnt/devsudo mount --bind /proc /mnt/procsudo mount --bind /sys /mnt/sys5.Chroot 到硬盘上的 Linux 系统代码如下:sudo chroot /mnt6.安装&更新 Grub代码如下:grub2-install /dev/sdagrub2-mkconfig -o /boot/grub2/grub.cfg7.Grub 已经修复成功,我们还需要退出 chroot 环境、卸载已经挂载的设备与目录:代码如下:exit #退出 chroot 环境sudo umount /mnt/devsudo umount /mnt/procsudo umount /mnt/syssudo umount /mnt8.重启!上面就是使用Ubuntu LiveCD修复grub的方法介绍了,假如你在使用双系统安装windows中出现Grub引导错误,不妨使用该方法进行修复吧。

热门文章

友情链接

滇ICP备2023006006号-39