【问题标题】:Java program runs smoothly in Netbeans but slowly in Eclipse and as an executable jarJava 程序在 Netbeans 中运行顺畅,但在 Eclipse 中运行缓慢,并且作为可执行 jar 运行
【发布时间】:2011-01-07 16:51:02
【问题描述】:

一个执行频繁摆动/awt 绘画动画的 java 程序(但没有比 g.fillOval(...) 更高级的了)在 Netbeans 中以一致的 60fps 运行,在 Eclipse 中运行或作为 jar 执行时大约为 6fps来自 Unix 终端的文件。该程序是在 Netbeans 中开发的,是普通的桌面应用程序(不是 webstart 或 japplet 或......)。这发生在带有 java 1.6 的 Ubuntu 10 中。这怎么可能?

$ java -version
java版本“1.6.0_22”

Java(TM) SE 运行时环境(build 1.6.0_22-b04)

Java HotSpot(TM) Client VM(build 17.1-b03,混合模式,共享)


设置默认jvm为sun版本,输出netbeans和unix终端使用的jvm,两者都是一样的:

java.runtime.name=Java(TM) SE Runtime Environment, sun.boot.library.path=/usr/lib/jvm/java-6-sun-1.6.0.22/jre/lib/i386, java.vm.version=17.1-b03, java.vm.vendor=Sun Microsystems Inc.

但是,这没有任何区别,因为仍然存在显着的帧速率差异。是否还有其他因素可能在这里发挥作用?

【问题讨论】:

  • 在 ubuntu 中你运行的是 Sun 的 JVM 吗?
  • “在 NetBeans 中”运行实际上意味着什么?它仍然是由 NetBeans 启动的一个单独的 JVM 进程,对吗?如果是这样,是否有可能找出NB使用什么命令行来启动它?
  • 首先发布 java --version 的输出。
  • OpenJDK != Sun 的 JDK :)。安装 Sun JDK 并重试
  • 另外,我相信您可以在运行时检查系统属性 (System.getProperties()) 并验证您在每种情况下运行的 JVM。

标签: java performance


【解决方案1】:

可能的原因之一可能是 NetBeans 可以使用一个 JVM,而 Eclipse 和终端“java”命令可以使用另一个。查看 NetBeans 为您的项目使用的平台,并将其与 Eclipse 进行比较。

您传递给 JVM 的参数也可能存在一些问题。也检查一下。

【讨论】:

    【解决方案2】:

    在 Ubuntu 中有一个非常方便的实用程序。试试这个:

    sudo update-java-alternatives -s java-6-sun 
    

    在外壳中。它可能会输出一些错误...

    update-alternatives: error: no alternatives for mozilla-javaplugin.so. 
    update-alternatives: error: no alternatives for xulrunner-1.9-javaplugin.so. 
    update-alternatives: error: no alternatives for mozilla-javaplugin.so. 
    update-alternatives: error: no alternatives for xulrunner-1.9-javaplugin.so.
    

    这只是 Firefox 的 java 插件的问题。你可以忽略这一点。如果您有任何其他问题,请通过发出以下命令检查您安装了哪个 java:

    sudo update-java-alternatives -l
    

    或者,您可以使用交互式版本:

    sudo update-java-alternatives --config
    

    (...这个我没有测试过)。

    如果由于任何原因您没有列出 Sun 的 JDK,请发表评论。


    编辑

    您是否使用硬件加速?尝试添加这个 JVM 属性:

    -Dsun.java2d.opengl=True 
    

    要查看您还可以使用的详细信息:

    -Dsun.java2d.trace=log 
    

    详情请咨询OpenGL acc

    【讨论】:

    • 不使用 java2D?这很奇怪......你的图形堆栈是什么?您知道 Swing 内部使用 java2D 吗?编辑:只需阅读您的答案。显然你在不知不觉中使用它。你有 g.fillOval 其中 g 的类型是 java.awt.Graphics2D?
    • 如果您有兴趣,这里是代码:sourceforge.net/projects/somelameapp
    • 现在看。哦,天哪,真是太好了!到目前为止,它通过 NetBeans 和命令行 (ant run) 在 Windows 7 上顺利运行。我会安装 Ubuntu 看看它有什么用处。
    • 可能是,也可能不是。所有 Java2D 和 Swing 代码都有一个大问题:所有 GUI 代码都必须在 EDT 上运行。如果我阅读正确,那么您的组件将在另一个线程中更新(在我的情况下为'Thread[Thread-2,6,main]')。修复很简单。只需使用 SwingUtilities.invoke...() 包装任何与 GUI 相关的代码(我只在 ApplicationLogic 的第 842 行看到对 graphicPanel.repaint(); 的调用,但可能更多)(就像您在 main 方法中构造 GUI 一样)。再一次 - 它可能与您遇到的减速完全无关。
    • 抱歉评论混乱。您可能希望查看mindprod.com/jgloss/swingthreads.html 以获得更清晰、更全面的解释。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-02
    • 1970-01-01
    • 1970-01-01
    • 2016-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多