调整 JVM 开关以获得最佳性能
JVM 提供调整内存分配和垃圾收集行为的各种标准和非标准开关。其中一些设置可以优化 NetBeans
的性能。
注意 -X 尤其是 -XX JVM 开关是正式“不支持的”,它们通常是特定于 JVM 或 JVM 厂商的。本页上讨论的开关可用于 Sun
Microsystems J2SE 1.5.0 上,其他 JVM 实现可能需要移除这些开关以便运行 NetBeans。例如,如果您想在 IBM JDK 上运行
IDE,您必须从配置文件 $NB_HOME/etc/netbeans.conf
中移除 -J-XX:Permsize=32m
和 –J-XX:MaxPermSize=96m
。
如何指定 JVM 开关
将 Java 开关传递到启动 JVM 的命令行上,例如,通过键入
java -jar -Xmx96M
someJar.jar
。由于 NetBeans 由启动程序启动,而不是通过直接调用
java
启动,因此在 IDE
安装的
etc
目录中名为
netbeans.conf
的特殊文件中查找这些设置。或者,通过在它们之后附加
-J
可以将参数传递给命令行上的 java 进程。
例如,要设置 -Xmx
(最大堆大小)以便运行 JVM NetBeans,编辑 $NB_HOME/etc
目录中名 netbeans.conf
的文件,并且包括 -J-Xmx256m
或通过键入
./netbeans -J-Xmx256m 启动 IDE,
或者在
Windows 系统上键入
netbeans.exe -J-Xmx256m
netbeans.conf
文件可以有各种 JVM 开关,这些开关包含在指定给 netbeans_default_options
变量的文本字符串中。注意,当传递给它不理解的行开关时 Sun JVM
不启动,但是它将返回一条指出问题内容的消息,例如:
java -foo
不识别的选项:-foo
无法创建 Java 虚拟机。
通常有用的开关
以下设置在大多数系统应该产生比出厂设置更好的性能。除了设置“permanent area”的大小之外,这些开关有时是
NetBeans 的默认值,并且在您的
netbeans.conf
文件中应该始终是默认设置。
- -J-Xverify:none - 该开关禁用 Java
字节代码验证,从而使加载更快,并且在启动过程中不需要加载类,仅用于验证。该开关缩短了启动时间,因此,没有理由不使用它。
- -J-Xms32m - 该设置告诉 Java 虚拟机将它的初始堆大小设置为 32 兆字节。通过告诉 JVM
最初应该为堆分配多少内存,我们保存的堆越来越大,因为 NetBeans 占用更多内存。该开关缩短启动时间。在 NetBeans
中默认使用该开关,因此您不需要指定它。
- -J-Xmx256m - 该设置告诉 Java 虚拟机它应该为该堆使用的最大内存数量。对该数量进行强硬的上限限制意味着 Java
进程占用的内存比可用的物理 RAM 少。对于具有较多内存的系统可以提高该显示。当前默认值为 128MB。注意: 不要将该值设置为接近或大于您系统中物理 RAM 的量,否则它将造成运行时期间严格的交换。
更多吸引人的开关
下面列出了在某些(并非全部)系统上显著影响 NetBeans 性能的一些其他 JVM 开关。您的里程可能不同,但是值得一试。
- -J-XX:+UseConcMarkSweepGC 或 -J-XX:+UseParNewGC -
如果您遇到入侵垃圾收集暂停的问题,则尝试这些开关。该开关使 JVM
对主要的垃圾收集事件(也对于次要的收集,如果运行在多处理器的工作站上)使用不同的算法,一些算法并不停止整个垃圾收集进程。您还应该向您的
netbeans.conf
文件中添加 -J-XX:+CMSClassUnloadingEnabled
和 -J-XX:+CMSPermGenSweepingEnabled
,以便启用类卸载(使用该收集器时,默认情况下不启用)。
- -XX:+UseAdaptiveSizePolicy - 该开关可能有助于提高垃圾收集器吞吐量并减少内存占用。在 JDK5.0 中实现的 garbage
collector ergonomics 的一部分。
- -J-XX:+UseParallelGC -
一些测试表明,至少在装备相当好的内存的系统上,当在单处理器系统上使用该收集算法时,次要垃圾收集的持续时间将减半。注意这是自相矛盾的,该收集器设计用于在具有十亿字节堆的多处理器系统上工作最佳。没有数据表示它在主要垃圾收集上的效果。注意: 该收集器和
-J-XX:+UseConcMarkSweepGC
是相互排斥的。支持使用该算法的测量位于性能网站上。
- -J-XX:CompileThreshold=100 - 该开关将使启动时间更慢,通过 HotSpot
来编译下载至本机的代码的很多方法比其他情况更快。报告的结果是 IDE 运行之后性能较高,因为将编译比解释的代码更多的 UI
代码。该值表示编译之前必须调用方法的次数。
影响图形行为的选项
本文档只包含一小部分可用的开关。有关影响 Java 2D(TM) 行为的属性的详细信息位于 Java 2D(TM)
技术的系统属性 文档中。
- -Dsun.java2d.opengl=true - 启用新的基于 OpenGL 的管道,以便 Java 2D 用来支持使用 OpenGL
的快速硬件渲染。有关此新的 JDK5.0 功能的详细信息位于 Java
2D(TM) 技术文档中。
- -Dsun.java2d.d3d=false - 该开关禁用 DirectDraw 并且可能解决一些 HW 配置的性能问题。
- -Dawt.nativeDoubleBuffering=true - 该开关使 Swing
假设操作系统正在处理双倍缓存并且它不应该执行任何操作。在远程 X
连接上该开关可能不工作,但是对于本地使用,它非常有用,因为您真正看到了每个重画的完成,这使它很容易注意到某些操作是否正在造成不必要的重画。
- Font anti-aliasing 用于 Swing widget,可以与 -Dswing.aatext=true 属性一起启用。与环境变量 J2D_PIXMAPS=shared 的设置和导出一起使用时非常有用,至少在 Linux
平台上可以获得合理的性能(现在在启动程序 (platform5/lib/nbexec) 中默认情况下指定该操作,因此您不需要设置它)。
这些选项的详细列表位于 JavaTM
HotSpot VM Options 页面上,该页面还参考包含 GC
调整的更详细描述的另一个文档。