小编bar*_*jak的帖子

更改操作系统时间时睡眠()中的Java错误:任何解决方法?

惹恼我的错误与此票相同.基本上,如果您将OS时钟更改为过去的日期,则更改时正在休眠的所有线程都不会被唤醒.

我正在开发的应用程序意味着24/24运行,我们希望能够在不停止的情况下更改操作系统日期(例如,从夏季时间切换到冬季时间).目前发生的事情是,当我们将日期更改为过去时,应用程序的某些部分就会冻结.我观察到在多台机器上,在Windows XP和Linux 2.6.37上,以及最近的JVM(1.6.0.22).

我尝试了很多Java睡眠原语,但它们都有相同的行为:

  • 了Thread.sleep(长)
  • Thread.sleep(long,int)
  • 的Object.wait(长)
  • Object.wait(long,int)
  • 的Thread.join(长)
  • Thread.join(long,int)
  • LockSupport.parkNanos(长)
  • java.util.Timer中
  • javax.swing.Timer中

现在,我不想解决这个问题.我认为我无法阻止睡眠线冻结.但我想至少在检测到危险的系统时钟变化时警告用户.

我想出了一个监控线程来检测这些变化:

    Thread t = new Thread(new Runnable() {
        @Override
        public void run() {
            long ms1 = System.currentTimeMillis();
            long ms2;
            while(true) {
                ms2 = ms1;
                ms1 = System.currentTimeMillis();
                if (ms1 < ms2) {
                    warnUserOfPotentialFreeze();
                }
                Thread.yield();
            }                    
        }
    });
    t.setName("clock monitor");
    t.setPriority(Thread.MIN_PRIORITY);
    t.setDaemon(true);
    t.start();
Run Code Online (Sandbox Code Playgroud)

问题是这使得应用程序在空闲时从2%的CPU使用率增长到15%.

你有想法解决原始问题,或者你能想到另一种监控线程冻结外观的方法吗?

编辑

Ingo建议不要触摸系统时钟.我同意通常不需要它.问题是我们无法控制客户对计算机的操作(我们计划销售数百份).

更糟糕的是:我们的一台机器没有任何人工干预就会出现这个问题.我想OS(Windows XP)会定期将其时钟与RTC时钟同步,这使得OS时钟自然会及时回溯.

结语

我发现我的问题中的一些陈述是错误的.我最初的问题实际上涉及两个不同的原因.现在,我可以肯定地说两件事:

  1. 在我的机器只(ArchLinux的内核2.6.37与OpenJDK的64位1.6.0_22) ,Thread.sleep,,Object.wait 有同样的问题:他们醒来,只有当系统时钟到达觉醒的"目标"的时间.但是,我的shell中的一个简单不会出现问题.Thread.joinLockSupport.parkNanossleep

  2. 在我测试的所有机器上(包括我的),java.util.Timer并且 …

java sleep clock

16
推荐指数
1
解决办法
6280
查看次数

找到与DLL中的偏移量匹配的Delphi源代码行

我试图在我的Java应用程序中找到崩溃的原因.它实际上是JVM的崩溃,是由通过JNI调用本机库引起的.

以下是我在生成中可以看到的内容hs_err_pidxxxx.log:

#
# A fatal error has been detected by the Java Runtime Environment:
#
#  EXCEPTION_INT_DIVIDE_BY_ZERO (0xc0000094) at pc=0x4fa19409, pid=1456, tid=4068
#
# JRE version: 6.0_30-b12
# Java VM: Java HotSpot(TM) Client VM (20.5-b03 mixed mode windows-x86 )
# Problematic frame:
# C  [JCustomOpc.dll+0x9409]
#
# If you would like to submit a bug report, please visit:
#   http://java.sun.com/webapps/bugreport/crash.jsp
# The crash happened outside the Java Virtual Machine in native code.
# See problematic frame for …
Run Code Online (Sandbox Code Playgroud)

java delphi debugging java-native-interface assembly

9
推荐指数
1
解决办法
1086
查看次数

记录在少数特定情况下丢失的消息

我正在使用java.util.logging我的应用程序的所有日志记录.

直到最近,我在没有任何特定配置的情况下使用日志工具.一切都按预期工作,所有日志都在控制台中可见(stderr)

现在,我想自定义日志的配置.我希望日志显示在控制台上,但我希望它们也可以写在文件中.我提出了以下解决方案:

public static void main(String[] args) {
    System.setProperty("java.util.logging.config.file", "log.config");
    Logger defLogger = Logger.getLogger("fr.def"); // all loggers I use begin by "fr.def"
    defLogger.setLevel(Level.ALL);
    defLogger.addHandler(new ConsoleHandler());
    defLogger.addHandler(new FileHandler());
    // real code here ...
Run Code Online (Sandbox Code Playgroud)

这是log.config文件的内容:

java.util.logging.FileHandler.formatter=java.util.logging.SimpleFormatter
java.util.logging.FileHandler.count=10
java.util.logging.FileHandler.pattern=logs/visiodef2.%g.log
Run Code Online (Sandbox Code Playgroud)

这个解决方案大部分都有效:我可以在控制台和文件中看到日志.除此之外,在某些情况下,一些日志消息只是丢失(对于控制台和文件).日志丢失的情况示例:

  • 在JVM的关闭挂钩上
  • 在默认的未捕获异常处理程序上
  • 在EDT的异常处理程序上
  • 在主JFrame的windowClosing事件上(使用默认关闭操作EXIT_ON_CLOSE配置)

除了上面描述的之外,没有其他配置.不涉及日志级别:我可以看到一些INFO日志,但有些丢失的日志是严重的.

我还尝试添加一个关闭钩子来刷新所有处理程序,但没有成功.

所以,问题是:按照我的方式配置日志记录是否安全?你能看出为什么有些日志会丢失的原因吗?

java logging exception-handling

6
推荐指数
1
解决办法
1184
查看次数

JButton的动作调用了focusLost事件.这怎么可能?

我们的一位客户在我们的申请中报告了一个例外.问题是,我完全无法理解如何重现这个bug.

这是代码:

btn.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        popup.show(btn, 3, btn.getHeight());
    }
});
Run Code Online (Sandbox Code Playgroud)

备注:

  • btn是类型的最终局部变量JButton.
  • popup是类型的最终局部变量JPopupMenu.

抛出以下异常:

java.awt.IllegalComponentStateException: component must be showing on the screen to determine its location
    at java.awt.Component.getLocationOnScreen_NoTreeLock(Unknown Source)
    at java.awt.Component.getLocationOnScreen(Unknown Source)
    at javax.swing.JPopupMenu.show(Unknown Source)
    at fr.def.iss.vd2.mod_site_watcher_gui.SiteElementPanel$4.actionPerformed(SiteElementPanel.java:117)
    at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
    at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
    at javax.swing.plaf.basic.BasicButtonListener.focusLost(Unknown Source)
    at java.awt.Component.processFocusEvent(Unknown Source)
    at java.awt.Component.processEvent(Unknown Source)
    at java.awt.Container.processEvent(Unknown Source)
    at java.awt.Component.dispatchEventImpl(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at …
Run Code Online (Sandbox Code Playgroud)

java swing action focus jbutton

5
推荐指数
1
解决办法
2545
查看次数

了解幸存的世代指标

Netbeans的内存监控工具(实际上是嵌入式VisualVmVisualVm相同的工具)具有用于跟踪内存泄漏的有效度量标准:Surviving Generations Metric.

可以在oracle.com上找到此度量标准定义:

  • 生成是在同一GC间隔(两个垃圾收集之间)中创建的一组实例
  • 幸存的一代是至少存在一次垃圾收集的一代.幸存垃圾收集的数量 - 代的年龄 - 是其唯一标识符
  • 幸存世代(度量)值是堆上当前存活的不同生存世代的数量(具有不同世代年龄的世代数)

我对第二个定义有疑问.我知道实例在垃圾收集中存活意味着什么.但是我不确定一代人在垃圾收集中存活意味着什么.这是否意味着至少有一代实例能够在垃圾收集中幸存下来?

java garbage-collection memory-leaks netbeans visualvm

5
推荐指数
1
解决办法
2604
查看次数

在Hg扩展中重载pull命令

我正在尝试调试Mercurial扩展.此扩展添加了一些应在执行时执行的代码pull.原作者通过更改存储库对象的类来设置此挂钩.

这是相关代码(实际上是一个有效的Mercurial扩展):

def reposetup(ui, repo):
    class myrepo(repo.__class__):
        def pull(self, remote, heads=None, force=False):
            print "pull called"
            return super(myrepo, self).pull(remote, heads, force)

    print "reposetup called"
    if repo.local():
        print "repo is local"
        repo.__class__ = myrepo
Run Code Online (Sandbox Code Playgroud)

hg pull启用此扩展时执行a 时,输出如下:

# hg pull
reposetup called
repo is local
pulling from ssh://hgbox/myrepo
reposetup called
searching for changes
no changes found
Run Code Online (Sandbox Code Playgroud)

这是在pull命令中注入扩展代码的合理方法吗?为什么从未达到"拉叫"声明?

我在Windows 7上使用Mercurial 3.4.1和python 2.7.5.

python mercurial mercurial-extension

4
推荐指数
1
解决办法
205
查看次数

用于以图形方式自定义Nimbus外观的工具

我正在寻找几个月前使用的工具,但我无法记住这个名字.

这是一个用于自定义Nimbus Swing外观的图形工具.在窗口的右侧,有一组示例Swing组件,左侧是所有可自定义属性的列表(与结果相同UIManager.getDefaults()).该工具允许更改属性的值(颜色,字体,整数值),并实时查看右侧的结果.

该工具也允许导出文件中的更改(设置自定义值的Java代码).

我记得整个程序只是一个大的java文件.我认为这个工具是另一个项目的一部分(该工具是独立的).

java swing look-and-feel nimbus

3
推荐指数
1
解决办法
3874
查看次数