admin 管理员组

文章数量: 887021


2024年3月11日发(作者:matlab四张小图放在一排)

Java堆是指在程序运行时分配给对象生存的空间。通过-mx/-Xmx和-ms/-Xms来设置起始堆

的大小和最大堆的大小。根据自己JDK的版本和厂家决定使用-mx和-ms或-Xmx和-Xms。

Java堆大小决定了垃圾回收的频度和速度,Java堆越大,垃圾回收的频度越低,速度越慢。

同理,Java堆越小,垃圾回收的频度越高,速度越快。要想设置比较理想的参数,还是需要

了解一些基础知识的。 Java堆的最大值不能太大,这样会造成系统内存被频繁的交换和分

页。所以最大内存必须低于物理内存减去其他应用程序和进程需要的内存。而且堆设置的太

大,造成垃圾回收的时间过长,这样将得不偿失,极大的影响程序的性能。以下是一些经常

使用的参数设置:

1) 设置-Xms等于-XmX的值;

2) 估计内存中存活对象所占的空间的大小,设置-Xms等于此值,-Xmx四倍于此值;

3) 设置-Xms等于-Xmx的1/2大小;

4) 设置-Xms介于-Xmx的1/10到1/4之间;

5) 使用默认的设置。

大家需要根据自己的运行程序的具体使用场景,来确定最适合自己的参数设置。 除了

-Xms和-Xmx两个最重要的参数外,还有很多可能会用到的参数,这些参数通常强烈的依

赖于垃圾收集的算法,所以可能因为JDK的版本和厂家而有所不同。但这些参数一般在Web

开发中用的比较少,我就不做详细介绍了。在实际的应用中注意设置-Xms和-Xmx使其尽

可能的优化应用程序就行了。对于性能要求很高的程序,就需要自己再多研究研究Java虚

拟机和垃圾收集算法的机制了。可以看看曹晓钢翻译的《深入Java虚拟机》一书。

Java程序性能调优的基本知识和JDK

调优

一 基本知识

1.1 性能是什么

在性能调优之前,我们首先来了解一下性能是什么?关于性能,我想每个学习过Java的人都能列

出几点,甚至可以夸夸其谈。在《Java TM Platform Performance》一书中,定义了如下五个方面来作

为评判性能的标准:

1) 运算的性能——哪一个算法的执行性能最好?

2) 内存的分配——程序运行时需要耗费多少内存?

3) 启动的时间——程序启动需要多长时间?这在Web项目中的影响不大,但要注意部分程序需要

部署或运行在客户端时的情形(比如applet程序)。

4) 程序的可伸缩性——在压力负载的情况下,程序的性能如何?

5) 性能的感知——用户在什么情况下会觉得程序的性能不好?

以上五个方面,在具体的使用场景可以有选择的去评判。至于这五方面的性能调优,在后续的章节

中将会陆续的给以相应的性能调优策略。

1.2 调优的规则

我们只需要关心对我们程序有影响,可以察觉到的性能问题,而不是每一个类中的每一个方法我们

都需要想方设法的提高性能。如果程序的性能没有达到我们所期望的要求,我们才需要考虑如何优化性

能。同样的,晦涩的代码虽然提高了程序的性能,但同时可能带给我们的是维护的噩梦。我们需要折中

的考虑以上两种情况,使得程序的代码是优美的,并且运行的足够快,达到客户所期望的性能要求。

优化代码甚至会导致不良的结果,Donald Knuth(一位比较牛比较有影响的人物,具体是谁,我也

忘了,谁知道,可以告诉我一下,谢谢!)曾说过,“Premature optimization is the root of all evil”。

在开始性能调优前,需要先指出不优化代码的一些理由。

1) 如果优化的代码已经正常工作,优化后可能会引入新的bug;

2) 优化代码趋向于使代码更难理解和维护;

3) 在一个平台上优化的代码,在另一个平台上可能更糟;

4) 花费很多时间在代码的优化上,提高了很少的性能,却导致了晦涩的代码。 确实,在优化前,

我们必须认真的考虑是否值得去优化。

1.3 调优的步骤

一般我们提高应用程序的性能划分为以下几个步骤:

1) 明确应用程序的性能指标,怎样才符合期望的性能需求;

2) 在目标平台进行测试;

3) 如果性能已经达到性能指标,Stop;

4) 查找性能瓶颈;

5) 修改性能瓶颈;


本文标签: 性能 程序 需要 优化 代码