惹恼我的错误与此票相同.基本上,如果您将OS时钟更改为过去的日期,则更改时正在休眠的所有线程都不会被唤醒.
我正在开发的应用程序意味着24/24运行,我们希望能够在不停止的情况下更改操作系统日期(例如,从夏季时间切换到冬季时间).目前发生的事情是,当我们将日期更改为过去时,应用程序的某些部分就会冻结.我观察到在多台机器上,在Windows XP和Linux 2.6.37上,以及最近的JVM(1.6.0.22).
我尝试了很多Java睡眠原语,但它们都有相同的行为:
现在,我不想解决这个问题.我认为我无法阻止睡眠线冻结.但我想至少在检测到危险的系统时钟变化时警告用户.
我想出了一个监控线程来检测这些变化:
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时钟自然会及时回溯.
我发现我的问题中的一些陈述是错误的.我最初的问题实际上涉及两个不同的原因.现在,我可以肯定地说两件事:
在我的机器只(ArchLinux的内核2.6.37与OpenJDK的64位1.6.0_22) ,Thread.sleep,,Object.wait 有同样的问题:他们醒来,只有当系统时钟到达觉醒的"目标"的时间.但是,我的shell中的一个简单不会出现问题.Thread.joinLockSupport.parkNanossleep
在我测试的所有机器上(包括我的),java.util.Timer并且 …
我试图在我的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.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)
这个解决方案大部分都有效:我可以在控制台和文件中看到日志.除此之外,在某些情况下,一些日志消息只是丢失(对于控制台和文件).日志丢失的情况示例:
除了上面描述的之外,没有其他配置.不涉及日志级别:我可以看到一些INFO日志,但有些丢失的日志是严重的.
我还尝试添加一个关闭钩子来刷新所有处理程序,但没有成功.
所以,问题是:按照我的方式配置日志记录是否安全?你能看出为什么有些日志会丢失的原因吗?
我们的一位客户在我们的申请中报告了一个例外.问题是,我完全无法理解如何重现这个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) Netbeans的内存监控工具(实际上是嵌入式VisualVm与VisualVm相同的工具)具有用于跟踪内存泄漏的有效度量标准:Surviving Generations Metric.
我对第二个定义有疑问.我知道实例在垃圾收集中存活意味着什么.但是我不确定一代人在垃圾收集中存活意味着什么.这是否意味着至少有一代实例能够在垃圾收集中幸存下来?
我正在尝试调试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.
我正在寻找几个月前使用的工具,但我无法记住这个名字.
这是一个用于自定义Nimbus Swing外观的图形工具.在窗口的右侧,有一组示例Swing组件,左侧是所有可自定义属性的列表(与结果相同UIManager.getDefaults()).该工具允许更改属性的值(颜色,字体,整数值),并实时查看右侧的结果.
该工具也允许导出文件中的更改(设置自定义值的Java代码).
我记得整个程序只是一个大的java文件.我认为这个工具是另一个项目的一部分(该工具是独立的).