java高级开发必会的性能优化的细节

mqlblog mqlblog     2022-12-21     256

关键词:

JAVA程序中,性能问题的大部分原因并不在于JAVA语言,而是程序本身。养成良好的编码习惯非常重要,能够显著地提升程序性能。

(1) 尽量在合适的场合使用单例

使用单例可以减轻加载的负担,缩短加载的时间,提高加载的效率,但并不是所有地方都适用于单例,简单来说,单例主要适用于以下三个方面:

第一,控制资源的使用,通过线程同步来控制资源的并发访问;

第二,控制实例的产生,以达到节约资源的目的;

第三,控制数据共享,在不建立直接关联的条件下,让多个不相关的进程或线程之间实现通信。

(2)尽量避免随意使用静态变量

当某个对象被定义为static变量所引用,那么GC通常是不会回收这个对象所占有的内存

(3)尽量避免过多过常地创建Java对象

尽量避免在经常调用的方法,循环中new对象,由于系统不仅要花费时间来创建对象,而且还要花时间对这些对象进行垃圾回收和处理,在我们可以控制的范围内,最大限度地重用对象,最好能用基本的数据类型或数组来替代对象。

(4)尽量使用final修饰符

带有final修饰符的类是不可派生的。在JAVA核心API中,有许多应用final的例子,例如java、lang、String,为String类指定final防止了使用者覆盖length()方法。另外,如果一个类是final的,则该类所有方法都是final的。java编译器会寻找机会内联(inline)所有的final方法(这和具体的编译器实现有关),此举能够使性能平均提高50%。

(5)尽量使用局部变量

调用方法时传递的参数以及在调用中创建的临时变量都保存在栈(Stack)中,速度较快;其他变量,如静态变量、实例变量等,都在堆(Heap)中创建,速度较慢。

(6)尽量处理好包装类型和基本类型两者的使用场所

虽然包装类型和基本类型在使用过程中是可以相互转换,但它们两者所产生的内存区域是完全不同的,基本类型数据产生和处理都在栈中处理,包装类型是对象,是在堆中产生实例。在集合类对象,有对象方面需要的处理适用包装类型,其他的处理提倡使用基本类型。

(7)慎用synchronized,尽量减小synchronize的方法

都知道,实现同步是要很大的系统开销作为代价的,甚至可能造成死锁,所以尽量避免无谓的同步控制。synchronize方法被调用时,直接会把当前对象锁了,在方法执行完之前其他线程无法调用当前对象的其他方法。所以,synchronize的方法尽量减小,并且应尽量使用方法同步代替代码块同步。

(8)尽量不要使用finalize方法

实际上,将资源清理放在finalize方法中完成是非常不好的选择,由于GC的工作量很大,尤其是回收Young代内存时,大都会引起应用程序暂停,所以再选择使用finalize方法进行资源清理,会导致GC负担更大,程序运行效率更差。

(9)尽量使用基本数据类型代替对象

10多线程在未发生线程安全前提下应尽量使用HashMap、ArrayList

HashTable、Vector等使用了同步机制,降低了性能。

11尽量减少对变量的重复计算在循环中应该避免使用复杂的表达式,在循环中,循环条件会被反复计算,如果不使用复杂表达式,而使循环条件值不变的话,程序将会运行的更快。

12尽量在finally块中释放资源

程序中使用到的资源应当被释放,以避免资源泄漏,这最好在finally块中去做。不管程序执行的结果如何,finally块总是会执行的,以确保资源的正确关闭。

(13)尽量早释放无用对象的引用

大部分时,方法局部引用变量所引用的对象会随着方法结束而变成垃圾,因此,大部分时候程序无需将局部,引用变量显式设为null。

(14)尽量缓存经常使用的对象

尽可能将经常使用的对象进行缓存,可以使用数组,或HashMap的容器来进行缓存,但这种方式可能导致系统占用过多的缓存,性能下降,推荐可以使用一些第三方的开源工具,如EhCache,Oscache进行缓存,他们基本都实现了FIFO/FLU等缓存算法。

(15)慎用异常

当创建一个异常时,需要收集一个栈跟踪(stack track),这个栈跟踪用于描述异常是在何处创建的。构建这些栈跟踪时需要为运行时栈做一份快照,正是这一部分开销很大。当需要创建一个 Exception 时,JVM 不得不说:先别动,我想就您现在的样子存一份快照,所以暂时停止入栈和出栈操作。栈跟踪不只包含运行时栈中的一两个元素,而是包含这个栈中的每一个元素。

如果您创建一个 Exception ,就得付出代价,好在捕获异常开销不大,因此可以使用 try-catch 将核心内容包起来。从技术上讲,你甚至可以随意地抛出异常,而不用花费很大的代价。招致性能损失的并不是 throw 操作——尽管在没有预先创建异常的情况下就抛出异常是有点不寻常。真正要花代价的是创建异常,幸运的是,好的编程习惯已教会我们,不应该不管三七二十一就抛出异常。异常是为异常的情况而设计的,使用时也应该牢记这一原则。

-----------转载自微信公众号:云时代架构

java开发必会的linux命令

Java开发必会的Linux命令快,关注这个公众号,一起涨姿势~作为一个Java开发人员,有些常用的Linux命令必须掌握。即使平时开发过程中不使用Linux(Unix)或者mac系统,也需要熟练掌握Linux命令。因为很多服务器上都是Linux系统。... 查看详情

29个阿里架构师必会的核心实战知识点整理清单

29个阿里架构师必会的核心实战知识点整理清单Java高级架构n 2019-06-2409:00:00由于每篇的细节内容实在太多啦,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有各种细化讲解内容!JVMJVM是可运行Java代码... 查看详情

java开发必会的linux命令

...文链接:https://www.cnblogs.com/zhuawang/p/5212809.html作为一个Java开发人员,有些常用的Linux命令必须掌握。即时平时开发过程中不使用Linux(Unix)或者mac系统,也需要熟练掌握Linux命令。因为很多服务器上都是Linux系统。所以,要和服务... 查看详情

2021androidapp开发工作必知必会之性能优化

AndroidApp启动优化全记录一、应用启动概述1、应用启动的一般流程应用的启动,从桌面点击应用图标到主界面用户可操作,大致遵循下面的流程:可以看到应用启动过程中,最重要的两个进程就是SystemServer和AppProce... 查看详情

新人入坑redis必会的吐血总结(代码片段)

...Redis必会的吐血总结一、什么是RedisRedis是一个使用C语言开发的开源的高性能的key-value存储系统,我们可以把它近似理解为JavaMap。简单来讲,Redis是一种NOSQL内存数据库,小伙伴们可不要把它理解为NOSQL(不是SQL),它的全称是NotOnlyS... 查看详情

2020最新40k技能清单:聚焦java开发工程师必知必会的进阶知识!

在你身边可有这一些这样的事件现象已经工作两三年了,每个项目都会加班加点全力以赴去完成,薪资增长幅度却不如人意。听说年后离职的老同事,金三刚拿下高薪offer,年薪直奔50万了。由于现在的公司接触不到新技术,对... 查看详情

java必会的工具库,让你的代码量减少90%

...现有很多工具类库,可以大大简化代码量,提升开发效率,初级开发者却不知道。而这些类库早就成为了业界标准类库,大公司的内部也都在使用,如果刚工作的时候就有人告诉我使用这些工具类库,该多... 查看详情

好奇?!elasticsearch25个必知必会的默认值

...”关键词的讨论接近400多处。这些默认值对于架构选型、开发实战、运维排查性能问题等都有很好的借鉴价值,虽官方文档都有详细论述,但散落在各个角度。处于本能的好奇心,我认为非常有必要结合自己的实战经历梳理出Ela... 查看详情

idea工具java开发之开发中必会的技能

一、高效的代码编辑技能  ◆复制和复制历史    复制一行:光标放在任意位置,Ctrl+C    复制文件名:电击左侧文件名,然后Ctrl+C——Ctrl+V           复制历史:Ctrl+Shift+C,双击记录后,... 查看详情

java必会的工具库,让你的代码量减少90%...(代码片段)

...现有很多工具类库,可以大大简化代码量,提升开发效率,初级开发者却不知道。而这些类库早就成为了业界标准类库,大公司的内部也都在使用,如果刚工作的时候就有人告诉我使用这些工具类库,该多... 查看详情

代码量减少90%,java程序员必会的工具库

...现有很多工具类库,可以大大简化代码量,提升开发效率,初级开发者却不知道。而这些类库早就成为了业界标准类库,大公司的内部也都在使用,如果刚工作的 查看详情

intellijidea必会的快捷键,成倍提高开发效率

参考自:https://blog.csdn.net/tang9140/article/details/52333601定位、切换、继承关系、调用关系、查找与替换、导航Navigation、Search、Replace等一、进入或返回方法(1)简单介绍Ctrl+B:查看方法定义或返回方法调用地方(与Ctrl+单击等价);(双... 查看详情

《java虚拟机》必知必会的14个问题总结(内存模型+gc)(代码片段)

一、Java 概述1、Java相较于 PHP、C#、Ruby 等一样很优秀的编程语言的优势是什么?(1)体系结构中立,跨平台性能优越。Java程序依赖于 JVM 运行,javac编译器编译Java程序为平台通用的字节码文件(.class&#x... 查看详情

java开发者必知必会的50个redis知识点,面试/学习都无所畏惧

推荐阅读关于"高并发系统设计"看这篇就够了,阿里、百度、美团都在用Redis作为目前的主流NoSql数据库,不会是不可能的,在面试中也是非常高频的,一定不能在这个环节丢分,不管是学习,还是面试,以下知识点,都... 查看详情

java性能优化:35个小细节让你提升java代码的运行效率

...小,代码的细节可以不精打细磨;但是如果有足够的时间开发、维护代码,这时候就必须考虑每个可以优化的 查看详情

java必会的基础知识

1.接口中所声明的方法都是抽象方法。接口中的方法都是public的。2.接口中也可以定义成员变量。接口中的成员变量都是public、final、static的。3.一个类不能既是final,又是abstract的。因为abstract的主要目的是定义一种约定,让子类... 查看详情

java必会的基础知识

1.类是一种抽象的概念,对象是类的一种具体表示形式,是具体的概念。先有类,然后由类来生成对象(Object)。对象又叫做实例(Instance)。2.类由两大部分构成:属性以及方法。属性一般用名词来表示,方法一般用动词来表示... 查看详情

java必会的基础知识

1.多态:父类型的引用可以指向子类型的对象。2.Parentp=newChild();当使用多态方式调用方法时,首先检查父类中是否有sing()方法,如果没有则编译错误;如果有,再去调用子类的sing()方法。3.一共有两种类型的强制类型转换:a)向上... 查看详情