Tag: jvm hotspot

Java中盒装基元的存储成本是多少?

Java中的java.lang.Integer或java.lang.Character这样的盒装原语有多大(以字节为单位)? int是4个字节,典型的指针也是4个字节(如果没有被JVM压缩)。 因此,整数(没有缓存)的成本是4 bytes + 4 bytes = 8 bytes ? 盒子对象中是否还有其他隐藏字段或者对象产生的额外开销(即,我不知道对象的一般成本是多少?)。 我对缓存问题不感兴趣。 我知道JVM会缓存一定范围内的整数。 可以重新解释这个问题:用于盒装值与原始值的内存量相乘的最大因子是多少? 编辑:我明白存在JVM的多个实现。 典型的32位HotSpot实现的典型成本是多少?

解释字节码与编译字节码?

我已经看到一些关于JVM / JIT活动的参考文献,其中似乎在编译字节码和解释字节码之间有所区别。 特定注释声明字节码被解释为前10000次运行并在此后编译。 “编译”和“解释”字节码有什么区别?

方法区域和PermGen

我试图理解HotSpot JVM的内存结构,并且混淆了两个术语’Method Area’和’PermGen’空间。 我提到的文档说,Method Area包含类和方法的定义,包括字节代码。 其他一些文档说它们存储在PermGen空间中。 那么我可以断定这两个存储区是一样的吗?

为什么HotSpot会使用吊装优化以下内容?

在“Effective Java”中,作者提到了这一点 while (!done) i++; 可以通过HotSpot进行优化 if (!done) { while (true) i++; } 我很困惑。 变量done通常不是const ,为什么编译器可以优化这种方式?

CompileThreshold,Tier2CompileThreshold,Tier3CompileThreshold和Tier4CompileThreshold控制什么?

HotSpot的分层编译使用解释器,直到调用(对于方法)或迭代(对于循环)的阈值触发具有自我分析的客户端编译。 使用客户端编译,直到另一个调用或迭代阈值触发服务器编译。 打印HotSpot的标志使用-XX:+ TieredCompilation显示以下标志值。 intx CompileThreshold = 10000 {pd product} intx Tier2CompileThreshold = 0 {product} intx Tier3CompileThreshold = 2000 {product} intx Tier4CompileThreshold = 15000 {product} 仅有客户端和服务器编译器的标志太多。 这些标志控制了哪些编译器? 如果不是客户端和服务器,其他编译器的目的是什么? 在这种情况下是否忽略CompileThreshold和Tier2CompileThreshold? 触发客户端编译时Tier3CompileThreshold控制什么? 触发服务器编译时Tier4CompileThreshold控制什么?

什么时候Hotspot可以在堆栈上分配对象?

从Java 6的某个地方开始,Hotspot JVM可以进行转义分析,并在堆栈上而不是在垃圾收集堆上分配非转义对象。 这导致生成的代码加速并减少垃圾收集器的压力。 Hotspot何时能够堆叠分配对象的规则是什么? 换句话说,我什么时候可以依靠它来进行堆栈分配? 编辑 :这个问题是重复的,但是(IMO)下面的答案比原始问题提供的答案更好。

JDK 8中的高级代码热插拔?

我在JavaVM中寻找更好的HotSwapping。 能够仅应用方法体改变是可以的,但是非常有限。 可用选项是JRebel和一个名为动态代码演进虚拟机(DCEVM)的已停产项目。 那里有一个由DCEVM的核心开发者编写的JEP 159 。 2011年的博客文章提到,DCEVM的开发人员现在可以在Oracle中将其集成到JDK中。 我们是否已经对JDK 8 beta有这种支持,还是推迟到JDK 9? 我需要热插拔来添加和删除以及重命名私有方法。 这会有很多帮助。 有没有一个产品允许我这样做(在JRebel旁边哪些公关活动让我心烦意乱)。 最后支持的DCEVM版本适用于1.6u24,它只提供32位Linux二进制文件。 由于我使用1.7和64位Linux,这对我来说都是一个显示阻止。 github上还有另一个名为Fakereplace的项目。 这可以很容易地用于我的目的,还是我不应该调查这个?

我如何知道为Sun JVM启用了哪些默认设置?

我想在我的JVM上尝试CompressedOops。 不,我想知道它是否可以默认启用。 我在debian / squeeze上运行这个jvm: $ java -version java version “1.6.0_22” Java(TM) SE Runtime Environment (build 1.6.0_22-b04) Java HotSpot(TM) 64-Bit Server VM (build 17.1-b03, mixed mode) 有人说它默认启用,有人说它不是: 来自: http : //forums.yourkit.com/viewtopic.php?f = 3&t = 3185 是的,你是对的,我也检查了它,并且在646位Java6u21中默认没有激活Compressed Oops,我不明白为什么它在我提供的链接中这么说。 我尝试用jconsole / JMX检查它,但没有运气找到名为CompressedOops或类似的属性。 有没有人知道我在哪里获得具有默认值的特定构建的所有jvm选项的列表? 关于Janning

String Literal在Java HotSpot vm中加载到StringTable的时间

当我学习java.lang.String Java API时,问题出来了。 我发现了一篇中文文章。 Java中新字符串(“字面量”)中“字面量”是何时进入字符串常量池的? 它说, CONSTANT_String是HotSpot VM中的延迟解析,因此String Literal被加载到StringTable util中使用它。 我发现了一些相关的说法。 jvms第5.4章。 链接说 例如,Java虚拟机实现可以选择在使用它时分别解析类或接口中的每个符号引用(“延迟”或“延迟”解析),或者在validation类时立即解析它们( “渴望”或“静态”解决方案)。 我找到了一些关于ldc openjdk代码 IRT_ENTRY(void, InterpreterRuntime::ldc(JavaThread* thread, bool wide)) // access constant pool constantPoolOop pool = method(thread)->constants(); int index = wide ? get_index_u2(thread, Bytecodes::_ldc_w) :get_index_u1(thread, Bytecodes::_ldc); constantTag tag = pool->tag_at(index); if (tag.is_unresolved_klass() || tag.is_klass()) { klassOop klass = pool->klass_at(index, CHECK); oop java_class […]

禁用特定方法/类的Java JIT?

我在我的Java应用程序中遇到了一个JIT破坏代码的问题。 如果我禁用JIT,一切正常,但运行速度慢10-20倍。 有没有办法禁用特定方法或类的JIT? 编辑:我正在使用Ubuntu 10.10,获得相同的结果: OpenJDK Runtime Environment (IcedTea6 1.9) (6b20-1.9-0ubuntu1) OpenJDK 64-Bit Server VM (build 17.0-b16, mixed mode) 和: Java(TM) SE Runtime Environment (build 1.6.0_16-b01) Java HotSpot(TM) 64-Bit Server VM (build 14.2-b01, mixed mode)