程序人生——Java使用关于性能和效率的建议

目录

引出

程序人生------Java使用关于性能和效率的建议


性能和效率

建议132:提升Java性能的基本方法

  • 如何让Java程序跑的更快、效率更高、吞吐量更大:1、不要在循环条件中计算 ,每循环一次就会计算一次,会降低系统效率;2、尽可能把变量、方法声明为final static类型 ,加上final static修饰后,在类加载后就会生成,每次方法调用则不再重新生成对象了;3、缩小变量的作用范围 ,目的是加快GC的回收;4、频繁字符串操作使用StringBuilder或StringBuffer5、使用非线性检索 ,使用binarySearch查找会比indexOf查找元素快很多,但是使用binarySearch查找时记得先排序;6、覆写Exception的fillInStackTrace方法 ,fillInStackTrace方法是用来记录异常时的栈信息的,这是非常耗时的动作,如果不需要关注栈信息,则可以覆盖,以提升性能;7、不建立冗余对象

建议133:若非必要,不要克隆对象

  • (克隆对象并不比直接生成对象效率高)(通过clone方法生成一个对象时,就会不再执行构造函数了,只是在内存中进行数据块的拷贝,看上去似乎应该比new方法的性能好很多,但事实上,一般情况下new生成的对象比clone生成的性能方面要好很多。JVM对new做了大量的系能优化,而clone方式只是一个冷僻的生成对象的方式,并不是主流,它主要用于构造函数比较复杂,对象属性比较多,通过new关键字创建一个对象比较耗时间的时候

建议134:推荐使用"望闻问切"的方式诊断性能

  • 性能诊断遵循"望闻问切",不可过度急躁

建议135:必须定义性能衡量标准

  • 原因:
    • 1、性能衡量标准是技术与业务之间的契约;
    • 2、性能衡量标志是技术优化的目标

建议136:枪打出头鸟---解决首要系统性能问题

  • 解决性能优化要"单线程"小步前进,避免关注点过多而导致精力分散)(解决性能问题时,不要把所有的问题都摆在眼前,这只会"扰乱"你的思维,集中精力,找到那个"出头鸟",解决它,在大部分情况下,一批性能问题都会迎刃而解

建议137:调整JVM参数以提升性能

  • 四个常用的JVM优化手段:
    • 1、调整堆内存大小 ,JVM两种内存:栈内存(Stack)堆内存(Heap)栈内存 的特点是空间小,速度快 ,用来存放对象的引用 及程序中的基本类型 ;而堆内存 的特点是空间比较大,速度慢一般对象 都会在这里生成、使用和消亡。栈空间由线程开辟 ,线程结束,栈空间由JVM回收,它的大小一般不会对性能有太大影响,但是它会影响系统的稳定性,超过栈内存的容量时,会抛StackOverflowError错误。可以通过**"java -Xss "设置栈内存大小来解决。堆内存的调整不能太随意,调整得太小,会导致Full GC频繁执行,轻则导致系统性能急速下降,重则导致系统根本无法使用;调整得太大,一则浪费资源(若设置了最小堆内存则可以避免此问题),二则是产生系统不稳定的情况,设置方法"java -Xmx1536 -Xms1024m"**,可以通过将-Xmx和-Xms参数值设置为相同的来固定堆内存大小;
    • 2、调整堆内存中各分区的比例 ,JVM的堆内存包括三部分:新生区(Young Generation Space)、养老区(Tenure Generation Space)、永久存储区(Permanent Space 方法区) ,其中新生成的对象都在新生区,又分为伊甸区(Eden Space)、幸存0区(Survivor 0 Space)和幸存1区(Survivor 1 Space),当在程序中使用了new关键字时,首先在Eden区生成该对象,如果Eden区满了,则触发minor GC,然后把剩余的对象移到Survivor区(0区或者1区),如果Survivor取也满了,则minor GC会再回收一次,然后再把剩余的对象移到养老区,如果养老区也满了,则会触发Full GC(非常危险的动作,JVM会停止所有的执行,所有系统资源都会让位给垃圾回收器),会对所有的对象过滤一遍,检查是否有可以回收的对象,如果还是没有的话,就抛出OutOfMemoryError错误。一般情况下新生区与养老区的比例为1:3左右 ,设置命令:"java -XX:NewSize=32m -XX:MaxNewSize=640m -XX:MaxPermSize=1280m -XX:NewRatio=5",该配置指定新生代初始化为32MB(也就是新生区最小内存为32M),最大不超过640MB,养老区最大不超过1280MB,新生区和养老区的比例为1:5.一般情况下Eden Space : Survivor 0 Space : Survivor 1 Space == 8 : 1 : 1);
    • 3、变更GC的垃圾回收策略,设置命令"java -XX:+UseParallelGC -XX:ParallelGCThreads=20",这里启用了并行垃圾收集机制,并且定义了20个收集线程(默认的收集线程等于CPU的数量),这对多CPU的系统时非常有帮助的,可以大大减少垃圾回收对系统的影响,提高系统性能;
    • 4、更换JVM,如果所有的JVM优化都不见效,那就只有更换JVM了,比较流行的三个JVM产品:Java HotSpot VM、Oracle JRockit JVM、IBM JVM。

建议138:性能是个大"咕咚"

  • 1、没有慢的系统,只有不满足义务的系统;
  • 2、没有慢的系统,只有架构不良的系统;
  • 3、没有慢的系统,只有懒惰的技术人员;
  • 4、没有慢的系统,只有不愿意投入的系统

深入认识JVM

JVM内存分配,类加载

Java进阶(1)------JVM的内存分配 & 反射Class类的类对象 & 创建对象的几种方式 & 类加载(何时进入内存JVM)& 注解 & 反射+注解的案例

创建对象的4种方法总结

Java进阶(4)------结合类加载JVM的过程理解创建对象的几种方式:new,反射Class,克隆clone(拷贝),序列化反序列化

垃圾回收GC

Java进阶(垃圾回收GC)------理论篇:JVM内存模型 & 垃圾回收定位清除算法 & JVM中的垃圾回收器

简介:本篇博客介绍JVM的内存模型,对比了1.7和1.8的内存模型的变化;介绍了垃圾回收的语言发展;阐述了定位垃圾的方法,引用计数法和可达性分析发以及垃圾清除算法;然后介绍了Java中的垃圾回收器,由串行、到并行再到并发,最后到G1的演变;最后给出了垃圾回收器的对比和使用指引。

JVM调优,Arthas使用

认识多线程

创建多线程方法+了解线程池

Java进阶(5)------创建多线程的方法extends Thread和implements Runnable的对比 & 线程池及常用的线程池

多线程下-1非原子性问题即解决

Java进阶(6)------抢购问题中的数据不安全(非原子性问题)& Java中的synchronize和ReentrantLock锁使用 & 死锁及其产生的条件

再论线程,创建、生命周期

Java进阶(再论线程)------线程的4种创建方式 & 线程的生命周期 & 线程的3大特性 & 集合中的线程安全问题

主要内容:

1.线程创建的方式,继承Thread类,实现Runable接口,实现Callable接口,采用线程池;

2.线程生命周期: join():运行结束再下一个, yield():暂时让出cpu的使用权,deamon():守护线程,最后结束,sleep():如果有锁,不会让出;

3.线程3大特性,原子性,可见性,有序性;

4.list集合中线程安全问题,hash算法问题;


总结

程序人生------Java使用关于性能和效率的建议

相关推荐
A_cot5 分钟前
深入了解 Maven 和 Redis
java·redis·maven
liuyang-neu5 分钟前
力扣中等 33.搜索旋转排序数组
java·数据结构·算法·leetcode
爱吃烤鸡翅的酸菜鱼29 分钟前
java(3)数组的定义与使用
java·开发语言·idea·intellij idea
ganjiee000740 分钟前
力扣(leetcode)每日一题 2414 最长的字母序连续子字符串的长度
java·算法·leetcode
kingbal44 分钟前
SpringBoot:解析excel
java·开发语言·excel
远望樱花兔1 小时前
【d44】【Java】【力扣】160.相交链表
java·开发语言·leetcode
山塘小鱼儿1 小时前
java学习路线
java
Leighteen1 小时前
如何在微服务的日志中记录每个接口URL、状态码和耗时信息?
java·开发语言
梦睡了1 小时前
SpringBoot+thymeleaf竞赛报名系统
java·spring boot·毕设
阿乾之铭1 小时前
Spring Service中的@Service注解的使用
java·spring boot·spring