1

我们在开发人员站点上发生了一个非常奇怪的错误,我们无法自行复制。

波兰的一位开发人员最近将他的 Windows XP Service Pack 3 机器升级到 4Gb 的 Ram 当他这样做时,他开始在使用 IBM JDK 1.5 的 Java 程序中遇到图形错误。这个错误只发生在 IBM JDK 1.5 中,而不会发生在任何其他版本中。

当您在窗体上创建按钮或控件并将鼠标移到它上面时,问题就会显现出来。

我们有一个测试程序

import java.awt.FlowLayout;

import javax.swing.JButton;
import javax.swing.JFrame;

public class GraphicTest {
    public static void main(String args[]) {
        JFrame frame = new JFrame("GraphicTest");
        frame.getContentPane().setLayout(new FlowLayout());
        frame.setSize(200, 200);
        JButton button = new JButton("Test button");
        button.setVisible(true);
        frame.getContentPane().add(button);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

这立即显示了问题。

但是,当我将相同的 Windows 版本升级到 4Gb 的 Ram 时,我自己的机器上不会出现问题。

有没有其他人见过这样的问题?

为了澄清这一点,这个问题只发生在 IBM JDK 1.5 中,并且只发生在我们有 4Gb 的 Ram 时。它不会发生在任何其他版本的 JDK 上,如果我们将内存量减少到 3 Gb,问题就会消失。

4

4 回答 4

3

尝试减少 Windows 图形驱动程序中的硬件优化(可通过扩展显示控制面板访问)。如果有问题的机器有一个使用部分主内存的板载图形适配器,那么升级 RAM 可能会暴露驱动程序中的问题(或者 RAM 甚至可能出现故障)。

于 2009-02-26T16:49:21.640 回答
1

首先要说的第一件事是:将 Swing 组件的使用限制在 AWT 事件调度线程 (EDT) 中。

public class GraphicTest {
    public static void main(final String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                runEDT();
            }
        });
    }
    private static void runEDT() {
        assert java.awt.EventQueue.isDispatchThread();
        JFrame frame = new JFrame("GraphicTest");
        ...

我不知道为什么内存大小很重要。也许它会以某种方式影响时间。也许 JVM 决定它在服务器级机器上运行并以更积极的优化运行。

于 2009-02-26T16:27:27.950 回答
1

只是为了排除硬件故障假设:让开发人员测试他的 RAM。Memtest86会这样做。

于 2009-02-26T16:49:38.817 回答
1

我在具有 3.24 G 内存的 IBM 机器上拥有完全相同的东西:所有的 Swing 应用程序都会显示——但文本(在菜单、表单、按钮上——似乎无处不在)是空白的。

在 Sun JDK 上运行的同一个 swing 程序没有问题。

我使用 Intel(r) 82865G 显卡将硬件加速从“完全”降低到“无”(在即插即用监视器设置中关闭“高级”显示)。

现在 Swing 应用程序似乎工作得很好。

好地方...

于 2009-12-10T11:45:00.460 回答