Tag: jvm hotspot

-Spot选项对HotSpot JVM的影响是什么?

我找不到任何有关在启动sun HotSpot JVM时传递-server选项的确切效果的明确文档。 任何人都可以总结它的作用吗?

Class.getConstantPool()

如果从rt.jar库反编译java中的java.lang.Class类,您会注意到有一个本机方法声明: native ConstantPool getConstantPool(); 我前一段时间使用Sun的.class文件规范进行类反编译,我能够从每个.class文件中获取常量池记录。 但这实际上是反编译类。 只是我很惊讶在Class类中看到这个签名。 所以我做的是在Main()方法中写了一小段代码: ConstantPool cp = new ConstantPool(); cp.getMethodAtIfLoaded(0); 如果您反编译sun.reflect.ConstantPool类,您会注意到它有很多与类,方法,参数,声明的字段等相关的方法。 当我执行应用程序时,我收到此HotSpotexception: # # An unexpected error has been detected by HotSpot Virtual Machine: # # EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x6d7e01d3, pid=2816, tid=5464 # # Java VM: Java HotSpot(TM) Client VM (1.5.0_15-b04 mixed mode) # Problematic frame: # V [jvm.dll+0xa01d3] # # […]

堆栈消费的变化来自何处?

在从这个问题运行测试代码并摆弄JVM的线程堆栈大小的同时,我发现结果不一定是可重复的:存在堆栈大小的值,程序有时会抛出java.lang.StackOverflowError ,但有时不会 。 我的问题是:“导致堆栈空间消耗变化的原因是什么?” 此外,中断的堆栈可以放在该程序的主线程上吗? 对于其他JVM实现和/或操作系统,结果是否同样不确定? 测试代码 public class PointlessRecursion { private static final long N = 1 << 15; private static long addOne(long n) { return (n < 2) ? n : 1 + (addOne(n – 1)); } public static void main(String[] args) { try { long x = addOne(N); System.out.println(x); assert(x == N); […]

JVM是否会内联对象的实例变量和方法?

假设我有一个非常紧凑的内循环,每次迭代访问并改变一个簿记对象,该对象存储有关算法的一些简单数据,并具有操作它的简单逻辑 簿记对象是私有的和最终的,它的所有方法都是私有的,最终的和@inline。 这是一个示例(在Scala语法中): object Frobnicate { private class DataRemaining(val start: Int, val end: Int) { @inline private def nextChunk = …. } def frobnicate { // … val bookkeeper = new DataRemaining(0, 1000) while( bookeeper.hasData ) { val data = bookkeeper.nextChunk // …… } } } JVM是否会将整个DataRemaining对象内联到Frobnicate.frobnicate ? 也就是说,它会将start和end视为局部变量并将nextChunk代码直接内联到frobnicate吗?

识别Java jdwp Debugger Assigned(Ephemeral)端口

我使用以下JVM参数来启动主机调试程序的JVM。 -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=0 请注意,我正在分配端口0,以便JVM向操作系统请求临时端口。 这对我的用例至关重要,以确保JVM不会因为某些预定义端口的争用而无法启动。 结果我的JVM启动,并将以下日志条目输出到stdout : Listening for transport dt_socket at address: XXXX 我想找到一些方法来识别JVM内部或外部的调试端口,因此我可以将它记录在状态管理服务器中。 这个用例有哪些选项? 我已经考虑了以下几点,但没什么乐趣: JMX Connector – 使用JConsole连接到进程,找到一些详细说明使用哪个端口的MBean。 但是,我找不到任何这样的MBean RMI注册表 – 是否可以让调试代理自己注册RMI注册表? 我没有发现任何可行的证据。 Java代理 – 指定可以拦截调试器某些方面并获取端口详细信息的JVM代理,再次没有证据支持这种想法的可行性。

在运行时更改JVM JIT选项

是否可以在运行时更改Java JVM(JIT)的选项和/或模式? 例如,更改XX:CompileThreshold,甚至在解释和编译的代码之间切换( -Xcomp vs -Xint )。 我的JVM来自OpenJDK(1.6),Hotspot或Zero / Shark

为什么java代码缓存大小在增长?

我有这个基本程序,除了坐在那里等待输入之外什么都不做: import java.io.*; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class Basic { public static void main(String[] args) throws Exception{ try{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String input; input=br.readLine(); }catch(IOException io){ io.printStackTrace(); } } } 当我运行这个: java -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=15001 -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false Basic 我通过JConsole连接看到这个: 这仅仅是因为核心java bytcode首先被编译? 当进程没有做任何事情时,如何增加codecache? 当我有这个版本(使用Thread.sleep )时: public class Basic { public […]

如何禁用sun jvm的内联优化?

我需要做一些实验,显示内联对我的代码的影响。 有谁知道如何禁用sun jvm内联? 我搜索了http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html并了解-XX:InlineSmallCode = n可以控制内联候选者的阈值。 那么-xx:InlineSmallCode = 0会起作用吗?

-Xss和-XX有什么区别:ThreadStackSize?

我只想控制Java(groovy)应用程序中所有线程的堆栈大小。 对于Hotspot Oracle VM,我知道有两个参数可以做到这一点( -Xss和XX:ThreadStackSize )。 哪个是首选? 它们之间有什么区别吗? 关于Open JDK 7, 有人在邮件列表上询问 ,说明-Xss对于Hotpot VM来说与-XX:ThreadStackSize 。 关键是,我正在测量可以在我的系统上启动多少个线程。 我的groovy脚本执行此操作看起来像: int count = 0 def printCountThreads = { println(“XXX There were started $count threads.”) } try { while(true){ new Thread({Thread.sleep(Integer.MAX_VALUE)}).start() count++ if(count % 1000 == 0){ printCountThreads() } } } catch (Throwable e){ printCountThreads() throw e } 有趣的是,我只使用XX:ThreadStackSize来减少线程数量。 […]

OpenJDK与Java HotspotVM

OpenJDK VM和Oracle Hotspot VM还有两种不同的JVM吗? 我似乎无法找到任何有关OpenJDK VM的官方文档。 即使在OpenJDK主页上也有一个开发HotSpot VM的HotSpot Group。 HotSpot组由参与HotSpot虚拟机的设计,实现和维护的开发人员组成 但是,如果我在我的Windows机器上检查java -version,它会打印出来 Java HotSpot(TM)64位服务器VM 但在我的Ubuntu VPS上 OpenJDK 64位服务器VM 如果这两个是不同的VM,它们之间的主要区别是什么? 他们有不同的运行时标志集吗?