我想在ubuntu 12.04上使用iReport.当我尝试启动它时,它静止不动,只是给了我这个错误:
Java HotSpot(TM) 64-Bit Server VM warning: You have loaded library /tmp/jna4023560596826437553.tmp which might have disabled stack guard. The VM will try to fix the stack guard now.
It's highly recommended that you fix the library with 'execstack -c <libfile>', or link it with '-z noexecstack'.
Run Code Online (Sandbox Code Playgroud)
我怎么解决这个问题 ?
编辑:我试过了:execstack -c /tmp/jna4023560596826437553.tmp但是没有用.
这个问题涉及 JIT 编译器确定它不会再生成堆栈跟踪的情况,如果它认为它之前已经这样做了一定次数。我知道这被称为“快速抛出”或“预分配”异常。
一般来说,如果遇到这样一个预先分配的异常,在 JIT 认为值得编译之前,在 JVM 生命周期的某个更早的时间点应该至少可以找到一次丢失的堆栈跟踪。
我的问题是,从报告的预分配异常到至少一个早期异常实例的映射是否可以保证是确定性的,如果不是,是否有任何方法可以避免这是除禁用之外的歧义来源完全使用 -XX:-OmitStackTraceInFastThrow 进行优化。
一个简单的例子:
报告的缩短/预分配异常是通用的,例如 NullPointerException。如果在 JVM 的早期生命周期中只有一种类型的堆栈跟踪以 NPE 结束,那么没问题。但是,如果代码中的各个点已经有多个 NPE 呢?JVM 没有给出任何早期堆栈已被编译或是否已被编译的任何指示,那么您如何确定性地确定堆栈跟踪会是什么?
这种情况真的会出现吗,或者现代 Hotspot JIT 是否足够聪明来避免产生这种歧义?
我在Stack Overflow上阅读了一些有关JVM的文章,并想下载Hotspot JVM的二进制副本,但是我无法在http://www.java.net上找到它。
除此之外,Hotspot JVM和Oracle的 JVM有什么区别?
Oracle JVM是否适合生产网站?
我知道 Java HotSpot 用来决定一个方法是否值得内联的标准之一是方法的大小。一方面,这似乎是明智的:如果方法很大,内联会导致代码膨胀,并且该方法需要很长时间来执行,以至于调用开销是微不足道的。这种逻辑的问题在于,在您决定内联之后,很明显,对于这个特定的调用站点,大部分方法都是死代码。例如,该方法可能是一个巨大的 switch 语句,但大多数调用站点使用编译时常量调用该方法,因此实际上:内联很便宜(不需要整个方法体;最小的代码膨胀)并且有效(方法调用开销支配实际完成的工作)。
HotSpot 是否有任何机制来利用这种情况并无论如何内联方法,或者是否存在限制甚至拒绝考虑内联方法的限制,即使它具有最小的代码膨胀效应?
java 堆可以使用的最大内存(由 -Xmx 配置)和初始 java 堆大小 (-Xms)。
-XX:+AlwaysPretouch 如何使用它们。它是否将内存预触摸到 -Xms 或 -Xmx。例如,当java以-Xmx=8G -Xms=4G -XX:+AlwaysPretouch启动时,它的驻留集大约是4G还是8G?
如果这很重要,我对 Linux 以及 java 7 和 9 上发生的事情感兴趣。
我为我的应用程序切换到CMS收集器,应用程序的吞吐量减少了一半。从GC日志中,我看到发生次要GC的频率很高(aroung 10 per second)。我分配的堆大小为4G。JVM默认为年轻一代使用非常小的大小(小于40MB)。我想通过增加年轻一代的规模来尝试CMS。您能为此指出正确的JVM参数吗?
java version "1.6.0_14"JVM应用程序在Oracle Hotspot JVM上运行,使用默认的JVM设置启动,但初始堆大小为100MB,最大堆大小为1GB。
在哪种情况下,JVM将决定增加当前堆大小,而不是尝试使用GC?
我正在尝试调试JDK9.
我想跟踪源代码并查看JDK/Hotspot代码的控制流程.
我使用gdb和Eclipse但是有一个问题SIGSEGV Segmentation fault.
我从JDK官方文档中按照Buildme.md配置JDK9,
bash ./configure --with-debug-level=slowdebug --with-target-bits=64
--disable-warnings-as-errors
Run Code Online (Sandbox Code Playgroud)
然后,
make all
Run Code Online (Sandbox Code Playgroud)
我得到我的自定义调试版本:
/images/jdk/bin/java -version openjdk version "9-internal"
OpenJDK Runtime Environment (build 9-internal+0-adhoc.xfwu.9dev)
OpenJDK 64-Bit Server VM (build 9-internal+0-adhoc.xfwu.9dev, mixed mode)
Run Code Online (Sandbox Code Playgroud)
以下代码段显示我使用HelloWorld.java来调试代码.我start是gdb.乍一看似乎很好.但是,当这个程序开始运行时thread 2,它会引发问题SIGSEGV Segmentation fault.我不知道为什么以及如何解决它.同样,我使用Eclipse进行调试,实际上,它与gdb没什么不同.从根本上说,他们都使用gdb.然后我得到同样的问题.
Thread 2 "java" received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7ffff7fc8700 (LWP 24030)]
0x00007fffe0dde513 in ?? ()
(gdb) info thread
Id Target Id Frame
1 Thread 0x7ffff7fc9700 (LWP 24012) "java" 0x00007ffff71c99cd in …Run Code Online (Sandbox Code Playgroud) 这是我运行以下命令时得到的输出的摘录(40只是Fibonacci程序的arg):
java -XX:+ UnlockDiagnosticVMOptions -XX:CompileCommand =“ print Fibonacci :: fibonacci” Fibonacci 40
有人可以解释每个数据的含义吗(我想这意味着字节数,例如,主代码需要288字节)。另外,各种类别是什么意思-重定位,存根代码,元数据,范围数据,范围pc,处理程序表等是什么意思?
...
Compiled method (c2) 93 16 4 Fibonacci::fibonacci (22 bytes)
total in heap [0xfff8000108113dd0,0xfff8000108114440] = 1648
relocation [0xfff8000108113f00,0xfff8000108113f48] = 72
main code [0xfff8000108113f60,0xfff8000108114080] = 288
stub code [0xfff8000108114080,0xfff80001081141e0] = 352
oops [0xfff80001081141e0,0xfff80001081141e8] = 8
metadata [0xfff80001081141e8,0xfff8000108114210] = 40
scopes data [0xfff8000108114210,0xfff8000108114298] = 136
scopes pcs [0xfff8000108114298,0xfff80001081143d8] = 320
dependencies [0xfff80001081143d8,0xfff80001081143e0] = 8
handler table [0xfff80001081143e0,0xfff8000108114440] = 96
----------------------------------------------------------------------
Fibonacci.fibonacci [0xfff8000108113f60, 0xfff80001081141e0] 640 bytes
[Entry Point]
[Verified Entry …Run Code Online (Sandbox Code Playgroud) 我们假设我们有以下代码:
public static void check() {
if (Config.initialized) {
...
}
}
Run Code Online (Sandbox Code Playgroud)
Config.initialized为开头假,只有在某个点的方法已经被JIT已经编译后变为真实.价值永远不会回归假.
我"知道"有很多非常复杂的优化正在进行(循环展开,分支预测,内联,逃逸分析等),虽然我远远没有详细了解它们,但我主要对以下内容感兴趣目前:
JIT编译器是否有办法在某个时间点之后检测到if将始终为true,以便可以完全跳过检查?完全我的意思是没有变量访问,没有条件检查/ jne等...
如果JIT没有办法摆脱(从某个点开始)不必要的样本检查(我不知道它怎么可能)有什么我可以做的来支持它?我唯一的想法是重新创建类,并在初始化事件发生后从字节代码中删除不必要的代码.
我知道这是完全微观优化,即使使用像JMH这样的工具也可能很难保证,但我仍然想知道和理解.
最后但并非最不重要的:
check方法需要重新编译?如果我正确理解我的JitWatch测试结果,上述问题的答案应该是:
jvm-hotspot ×10
java ×7
jvm ×7
jit ×2
performance ×2
c ×1
c++ ×1
eclipse ×1
ireport ×1
java-8 ×1
java-opts ×1
openjdk ×1
ubuntu-12.04 ×1