Tag: jvm hotspot

JVisualVM和Java Mission Control有什么区别?

除了来自Java任务控制的更高级的GUI之外,它们又有什么不同呢? 乍一看,他们似乎提供了非常相似的function(解释JMX数据和内存/ CPU分析)。 但是,因为它们都是与JDK一起发布的(我使用的是JDK 1.7.0_51 SE),所以我假设它们之间存在显着差异,否则它们将合并成一个解决scheme。 特别是因为这大大增加了JDK的大小。 Java Mission Control最终将在未来取代JVisualVM吗?

java PrintCompilation输出:“made not entrant”和“made zombie”的含义是什么?

运行Java 1.6(1.6.0_03-b05)应用程序时,我添加了-XX:+PrintCompilation标志。 在某些方法的输出中,特别是我所知道的一些方法被调用了很多,我看到文本made not entrant并made zombie 。 这是什么意思? 最好的猜测是,在重新编译该方法或具有更大优化的依赖性之前,这是一个反编译步骤。 真的吗? 为什么“僵尸”和“进入者”? 例如,在这些行之间有相当多的时间: [… near the beginning] 42 jsr166y.LinkedTransferQueue::xfer (294 bytes) [… much later] 42 made not entrant jsr166y.LinkedTransferQueue::xfer (294 bytes) — n sun.misc.Unsafe::compareAndSwapObject 170 jsr166y.LinkedTransferQueue::xfer (294 bytes) 170 made not entrant jsr166y.LinkedTransferQueue::xfer (294 bytes) 4% jsr166y.LinkedTransferQueue::xfer @ 29 (294 bytes) 171 jsr166y.LinkedTransferQueue::xfer (294 bytes) [… […]

我如何编码的Java允许使用SSE和边界检查消除(或其他高级优化)?

情况: 我正在优化LZF压缩algorithm的纯Java实现,它涉及到大量的byte []访问和基本的intmath,用于哈希和比较。 性能真的很重要,因为压缩的目标是减lessI / O需求。 我不张贴代码,因为它尚未清理,并可能会重组。 问题: 我怎样才能编写我的代码,以允许它使用更快的SSE操作JIT编译为表单? 我怎样才能构造它,使编译器可以轻松消除数组边界检查? 是否有关于特定math运算相对速度的广泛参考(需要多less增量/减量才能达到正常的加/减,移位速度有多快?还是与数组访问有多快? 我怎样才能优化分支 – 有更多的条件陈述短身体,或一些长期的,或短嵌套条件? 使用当前的1.6 JVM,在System.arraycopy击败复制循环之前必须复制多less个元素? 我已经做了什么: 在我受到过早优化攻击之前:基本algorithm已经非常优秀,但是Java的实现速度还不到C的速度的2/3。我已经用System.arraycopyreplace了复制循环,并且优化了循环,并且删除了un需要的操作。 我大量地使用bit来转换和填充字节来performance性能,以及转换和屏蔽。 出于法律方面的原因,我不能看类似库中的实现,而现有的库有太多限制的许可条款可供使用。 良好(接受)答案的要求: 不可接受的答案: “这是更快”没有解释多less和为什么,OR还没有用JIT编译器testing过。 边界线答案:在Hotspot 1.4之前没有经过任何testing 基本的答案:将提供一个通用的规则和解释,为什么它在编译器级别更快,并且大概快了多less 很好的答案:包括几个代码示例来演示 优秀的答案:有JRE 1.5和1.6的基准 完美的答案:是由HotSpot编译器工作的人员,可以完全解释或引用要使用的优化的条件,以及它通常的速度。 可能包括由HotSpot生成的Java代码和样例汇编代码。 另外:如果有人有详细的热点优化和分支性能的内涵的链接,欢迎。 我对字节码有足够的了解,即一个分析字节码而不是源代码级别的性能的站点会有所帮助。 (编辑)部分答案:Bounds-Check Ellimination: 这是从提供的链接到HotSpot内部维基: https : //wikis.oracle.com/display/HotSpotInternals/RangeCheckElimination 在以下情况下,HotSpot将消除所有for循环中的边界检查: 数组是循环不变的(不在循环内重新分配) 索引variables有一个不断的步幅(按照常量增加/减less,如果可能的话,只有一个点) 数组由variables的线性函数索引。 例如: int val = array[index*2 + 5] OR: int val = array[index+9 […]

JRockit JVM与HotSpot JVM

如果任何人都可以给我简要的信息,说明这两个JVM的优点和缺点,因为它们都依赖于标准JVM规范。

JIT不会优化涉及Integer.MAX_VALUE的循环

在写另一个问题的答案时,我注意到一个奇怪的边界情况下JIT优化。 以下程序不是 “Microbenchmark”, 并非旨在可靠地衡量执行时间(正如在其他问题的答案中指出的那样)。 它只是作为一个MCVE来重现这个问题: class MissedLoopOptimization { public static void main(String args[]) { for (int j=0; j<3; j++) { for (int i=0; i<5; i++) { long before = System.nanoTime(); runWithMaxValue(); long after = System.nanoTime(); System.out.println("With MAX_VALUE : "+(after-before)/1e6); } for (int i=0; i<5; i++) { long before = System.nanoTime(); runWithMaxValueMinusOne(); long after = System.nanoTime(); […]

-XX:MaxPermSize带或不带-XX:PermSize

我们遇到了Java.lang.OutOfMemoryError:PermGen空间错误,并查看了除了-Xms和-Xmx参数之外的tomcat JVM参数,我们也指定了-XX:MaxPermSize=128m 。 经过一些分析后,我可以偶尔看到在PermGen空间上发生的垃圾回收,从而节省了运行时间。 我的问题是:除了增加-XX:MaxPermSize如果我指定以及-XX:PermSize那将会是什么区别? 我知道总的内存然后是Xmx + maxPermSize,但是有什么其他原因为什么-XX:PermSize当指定-XX:MaxPermSize时, -XX:PermSize不应该在那里? 如果您有处理这些JVM参数的实际经验,请分享一下。 PS。 JVM是HotSpot 64位服务器VM版本16.2-b04

UseCompressedOops JVM标志是做什么的,什么时候应该使用它?

热点JVM标志-XX:+UseCompressedOops做什么,我应该什么时候使用它? 在64位Java实例上使用它(而不是使用它)时,我会看到什么样的性能和内存使用差异?

什么是ReservedCodeCacheSize和InitialCodeCacheSize?

有人可以请解释什么JVM选项ReservedCodeCacheSize和InitialCodeCacheSize是什么? 具体何时/为什么要改变它? 我如何确定合适的尺寸是多less? 这是文档所说的: -XX:ReservedCodeCacheSize = 32m预留代码caching大小(以字节为单位) – 最大代码caching大小。 [Solaris 64位,amd64和-server x86:2048m; 在1.5.0_06及更早版本中,Solaris 64位和64位:1024m。]

Java JIT在运行JDK代码时是否作弊?

我正在对一些代码进行基准testing,即使使用完全相同的algorithm,我也无法使它像java.math.BigInteger一样快速运行。 所以我复制java.math.BigInteger源到我自己的包,并试图这样做: //import java.math.BigInteger; public class MultiplyTest { public static void main(String[] args) { Random r = new Random(1); long tm = 0, count = 0,result=0; for (int i = 0; i < 400000; i++) { int s1 = 400, s2 = 400; BigInteger a = new BigInteger(s1 * 8, r), b = new BigInteger(s2 […]

读取Java JVM启动参数(例如-Xmx)

我试图找出是否有一种方法来确定在运行的Java进程中的JVM启动属性。 具体来说,我试图找出参数,如-Xmx(最大堆大小)和-XX:MaxPermSize被存储。 我正在运行Sun的1.6 jvm。 如果你想知道为什么要这样做,我有一些JVM的networking服务器,可能或可能不正确configuration,我想添加到启动代码检查。 检查一段随处可用的java代码比手动查找并检查所有的jvm启动文件要容易得多。 现在,jvmconfiguration文件的好坏不是我们构build过程的一部分,也不是源代码控制。