小编Chr*_*lan的帖子

什么可以导致同步块内的IllegalMonitorStateException?

我们今天遇到了一个非常令人惊讶的例外 在同步块内部,我们调用wait()并抛出它IllegalMonitorStateException.是什么导致这个?

这是在经过充分测试的开源代码中发生的:http: //svn.apache.org/viewvc/river/jtsk/trunk/src/com/sun/jini/jeri/internal/mux/Mux.java?view=markup #L222

我们消除了明显的原因:

  • 我们是否在正确的变量上同步?是的,它就是muxLock
  • 它是一个可变变量吗?不,muxLock是最后的
  • 我们使用任何可能影响监视器行为的奇怪的"-XX:"JVM标志吗?不,但我们正在通过JNI启动嵌入在C++应用程序中的JVM.
  • 这是一个奇怪的JVM吗?不,这是Sun的1.6.0_25 win/x64 JRE
  • 这是一个已知的JVM错误吗?在http://bugs.sun.com/bugdatabase上找不到任何相关内容

所以,我试图想出更多牵强附会的解释.

  • 一个未被发现的内存不足错误导致监视器状态被搞砸了?我们正在考虑这个问题,但我们还没有看到内存错误的证据.

更新:(根据评论)

我还从stacktrace和断点验证了当抛出异常时线程确实在synchronized块内.事实并非如此,其他一些不相关的代码会发出异常(除非有些东西真的让Eclipse混乱!)

java synchronization illegalmonitorstateexcep

30
推荐指数
1
解决办法
2390
查看次数

newInstance()vs new

调用newInstance()是否会受到惩罚,或者下面的机制是否相同?newInstance()对新关键字*有多少开销?

*:折扣newInstance()暗示使用反射的事实.

java reflection performance

26
推荐指数
1
解决办法
1万
查看次数

如何为VisualVM"<未知应用程序>"命名?

JDK 1.6捆绑了一个名为VisualVM的便捷工具,可以让您检查并运行正在运行的Java进程.一个功能是它可以自动检测本地计算机上正在运行的JVM.大多数都列为"(pid xxxx)",但有些名称和图标,如VisualVM本身和其他类似NetBeans(例如,请参阅此dzone文章中的屏幕截图).

如何将我的应用程序名称和图标注入JVM,以便它在VisualVM的应用程序列表中正确显示?我的应用程序是否需要运行JRE 1.6或者我是否可以在1.5下运行?

java jmx visualvm

21
推荐指数
1
解决办法
3239
查看次数

通过子字符串解析后如何回收内存?intern()或new String()?

简短版本:如果调用string.substring(n,m).intern(),字符串表是否保留子字符串或原始字符串?

......但我不确定这是一个正确的问题,所以这里是长版本:

我正在使用遗留Java代码(PCGen),它通过将每个文件作为一个大字符串进行篡改来解析文件,然后使用String.split,.trim,.substring和StringTokenizer将它们分解为标记.这对解析非常有效,因为这些方法都不会复制原始字符串,但都指向共享char []的部分.

解析结束后,我想收回一些内存.只需要原始大字符串的几个小子串,但强引用可以防止收集大字符串.后来我遇到了OOM,我相信部分归因于大量解析文件的巨大堆影响.

我知道我可以通过new String(String)写入时复制大字符串(copy-on-write).我知道我可以通过String.intern减少字符串重复(这很重要,因为在解析的文件中有很多冗余).我是否需要同时使用两者来回收最大量的堆,或者.intern()是否同时执行这两种操作?读取OpenJDK7热点源代码(hotspot/src/share/vm/classfile/symbolTable.cpp),它看起来像字符串表保留整个字符串,并且根本不修剪偏移/长度.所以我想我需要创建一个新的String然后实习结果.对?

所有这一切,切换到流式解析器在内存方面将是一个巨大的胜利,但这对于短期而言是一个太大的变化.

java memory

20
推荐指数
1
解决办法
609
查看次数

Amazon S3避免覆盖具有相同名称的对象

如果我将文件上传到S3,其文件名与存储桶中对象的文件名相同,则会覆盖它.有哪些选项可以避免覆盖具有相同文件名的文件?我在我的桶中启用了版本控制,认为它将解决问题,但对象仍然被覆盖.

php file-upload file amazon-s3 amazon-web-services

16
推荐指数
2
解决办法
2万
查看次数

如何在子类上使用JAXB @XmlValue?

我想要像这样的XML:

<simple>Foo</simple>
Run Code Online (Sandbox Code Playgroud)

我可以通过看起来像这样的JAXB类成功完成此操作:

@XmlRootElement(name="simple")
class Simple {
    @XmlValue
    public String contents;
}
Run Code Online (Sandbox Code Playgroud)

但是现在我需要使Simple类成为另一个类的子类,如下所示:

@XmlRootElement(name="simple")
class Simple extends OtherClass {
    @XmlValue
    public String contents;
}
Run Code Online (Sandbox Code Playgroud)

失败了,@XmlValue is not allowed on a class that derives another class.我无法轻易地重构超类(因为我们在包装类上使用@XmlElementRef的方式).有没有一种解决方法可以让我注释我的子类来生成那个简单的XML?

jaxb

14
推荐指数
2
解决办法
1万
查看次数

如何从2行java.util.logging输出中抑制日期行?

我正在使用Java默认记录器,现在它正在输出很多无用的垃圾,这里有一个例子,这行代码:

log.info("Logging pointless information...")
Run Code Online (Sandbox Code Playgroud)

将输出所有这些:

Oct 26, 2011 9:37:57 PM java.util.logging.LogManager$RootLogger log
INFO: Logging pointless information...
Run Code Online (Sandbox Code Playgroud)

除了第二行,我不需要知道任何事情.我怎样才能删除这些垃圾?我想要的只是简单的文本记录.

java logging java.util.logging

12
推荐指数
2
解决办法
7183
查看次数

iphone sqlite问题:sqlite3_prepare_v2上的"内存不足"

我想知道是否有人可以帮我理解这段代码有什么问题.我从未通过sqlite3_prepare_v2语句,调试器说:

'NSInternalInconsistencyException',原因:'创建add语句时出错.'内存不足''

    static sqlite3 *database = nil;
sqlite3_stmt *addStmt = nil;

if(addStmt == nil) {
    NSLog(@"About to add start time...\n");
    const char *sql = "INSERT INTO games_played(start) VALUES(?)";     
    if(sqlite3_prepare_v2(database, sql, -1, &addStmt, NULL) != SQLITE_OK)
        NSAssert1(0, @"Error while creating add statement. '%s'", sqlite3_errmsg(database));
    NSLog(@"add statement created successfully!\n");
}
NSLog(@"About to bind start time...\n");
sqlite3_bind_text(addStmt, 1, @"start time", -1, SQLITE_TRANSIENT);
Run Code Online (Sandbox Code Playgroud)

sqlite iphone

10
推荐指数
2
解决办法
1万
查看次数

如何测量线程堆栈深度?

我有一个带有可伸缩性问题的32位Java服务:由于线程计数过多,用户数量很多,因此内存不足.从长远来看,我计划切换到64位并减少每用户线程数.在短期内,我想减少堆栈大小(-Xss,-XX:ThreadStackSize)以获得更多的空间.但这有风险,因为如果我把它做得太小,我就会得到StackOverflowErrors.

如何衡量应用程序的平均和最大堆栈大小,以指导我决定最佳-Xss值?我对两种可能的方法感兴趣:

  1. 在集成测试期间测量正在运行的JVM.什么分析工具将报告最大堆栈深度?
  2. 寻找深度调用层次结构的应用程序的静态分析.依赖注入的反思使得这不可行.

更新:我知道解决此问题的长期正确方法.请关注我问过的问题:如何测量堆栈深度?

更新2:关于JProfiler的相关问题,我得到了一个很好的答案:JProfiler可以测量堆栈深度吗?(我根据JProfiler的社区支持建议发布了单独的问题)

java multithreading profiling

9
推荐指数
2
解决办法
2893
查看次数

如何使用端口1025-5000作为短暂的WinXP工作?

如果使用端口0而不是非零端口创建TCP客户端套接字,则操作系统会为您选择任何空闲的临时端口.大多数操作系统从IANA动态端口范围 49152-65535中选择短暂端口.但是,在Windows Server 2003及更早版本(包括XP)中,根据其bind()文档,Microsoft使用端口1025-5000作为临时范围.

我在同一硬件上运行多个Java服务.在极少数情况下,此范围与我用于其他服务的众所周知的端口(例如,端口4160用于Jini发现)相冲突.虽然很少见,但却造成了实际问题.有没有简单的方法告诉Windows或Java为客户端套接字使用不同的端口范围?微软的文档表明我可以通过MaxUserPort TcpIP注册表设置更改该范围的高端,但我认为没有办法改变低端.

更新:我在这方面取得了一些进展.看起来微软有一个保留端口的概念,它是短暂端口范围的例外.有一个注册表设置,允许你永久地更改它,显然必须有一个API来做同样的事情,因为有一个数据结构保存保留端口范围的高/低值,但我无法在任何地方找到实际的函数调用. ..注册表解决方案可能有效,但现在我已经注意到了这个API.

Update2:我在ServerFault上接受了一个解决方案,了解如何通过Windows注册表执行此操作.我仍然想通过API来做到这一点,但我想我现在很满意.

java sockets windows

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