主页 > 社区 > 项目 > 性能

调整 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 调整的更详细描述的另一个文档。