我们今天遇到了一个非常令人惊讶的例外 在同步块内部,我们调用wait()并抛出它IllegalMonitorStateException
.是什么导致这个?
这是在经过充分测试的开源代码中发生的:http: //svn.apache.org/viewvc/river/jtsk/trunk/src/com/sun/jini/jeri/internal/mux/Mux.java?view=markup #L222
我们消除了明显的原因:
muxLock
muxLock
是最后的所以,我试图想出更多牵强附会的解释.
更新:(根据评论)
我还从stacktrace和断点验证了当抛出异常时线程确实在synchronized块内.事实并非如此,其他一些不相关的代码会发出异常(除非有些东西真的让Eclipse混乱!)
调用newInstance()是否会受到惩罚,或者下面的机制是否相同?newInstance()对新关键字*有多少开销?
*:折扣newInstance()暗示使用反射的事实.
JDK 1.6捆绑了一个名为VisualVM的便捷工具,可以让您检查并运行正在运行的Java进程.一个功能是它可以自动检测本地计算机上正在运行的JVM.大多数都列为"(pid xxxx)",但有些名称和图标,如VisualVM本身和其他类似NetBeans(例如,请参阅此dzone文章中的屏幕截图).
如何将我的应用程序名称和图标注入JVM,以便它在VisualVM的应用程序列表中正确显示?我的应用程序是否需要运行JRE 1.6或者我是否可以在1.5下运行?
简短版本:如果调用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然后实习结果.对?
所有这一切,切换到流式解析器在内存方面将是一个巨大的胜利,但这对于短期而言是一个太大的变化.
如果我将文件上传到S3,其文件名与存储桶中对象的文件名相同,则会覆盖它.有哪些选项可以避免覆盖具有相同文件名的文件?我在我的桶中启用了版本控制,认为它将解决问题,但对象仍然被覆盖.
我想要像这样的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?
我正在使用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)
除了第二行,我不需要知道任何事情.我怎样才能删除这些垃圾?我想要的只是简单的文本记录.
我想知道是否有人可以帮我理解这段代码有什么问题.我从未通过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) 我有一个带有可伸缩性问题的32位Java服务:由于线程计数过多,用户数量很多,因此内存不足.从长远来看,我计划切换到64位并减少每用户线程数.在短期内,我想减少堆栈大小(-Xss,-XX:ThreadStackSize)以获得更多的空间.但这有风险,因为如果我把它做得太小,我就会得到StackOverflowErrors.
如何衡量应用程序的平均和最大堆栈大小,以指导我决定最佳-Xss值?我对两种可能的方法感兴趣:
更新:我知道解决此问题的长期正确方法.请关注我问过的问题:如何测量堆栈深度?
更新2:关于JProfiler的相关问题,我得到了一个很好的答案:JProfiler可以测量堆栈深度吗?(我根据JProfiler的社区支持建议发布了单独的问题)
如果使用端口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来做到这一点,但我想我现在很满意.