每次我使用-XX:+PrintAssemblyHotspot时都会让我烦恼,并且必须阅读可怕的AT&T语法.
有没有办法告诉它使用英特尔语法?
目前,我有一个已部署的可执行jar文件,可在崩溃时创建大型(7+ Gb)minidump文件.我想有一个文本表示导致崩溃的原因,而不是JVM状态的二进制文件.我已经尝试使用此CodeRanch帖子中的信息,我在Java文档中找到的文档似乎没有帮助.
我也引用了这个问题,但没有明确的答案.
是否有一种我不知道的典型方式?
我正在尝试为延迟敏感的Java应用程序编写一个预热例程,以便优化前几个可能因动态类加载和JIT(主要是)而减慢的事务.
我面临的问题是,即使我的预热代码加载所有类并通过多次调用它们(至少100次-XX:CompileThreshold)来练习它们,之后当实际用户登录这些相同的函数时仍然标记为"非参赛者"并再次重新编译,这会造成延迟.
JVM标志如下(我只添加了-XX:+ PrintCompilation -verbose:class tp troubleshoot,其他是遗留的):
-Xms5g -Xmx5g -server -XX:+ AggressiveHeap -XX:+ UseFastAccessorMethods -XX:+ PrintGCDetails -XX:CompileThreshold = 100 -XX:-CITime -XX:-PrintGC -XX:-PrintGCTimeStamps -XX:+ PrintCompilation -verbose:类
#Warmup happens here
12893 2351 my.test.application.hotSpot (355 bytes)
#Real user logs on here
149755 2351 made not entrant my.test.application.hotSpot (355 bytes)
151913 2837 my.test.application.hotSpot (355 bytes)
152079 2351 made zombie my.test.application.hotSpot (355 bytes)
Run Code Online (Sandbox Code Playgroud)
在预热之后没有发生类加载(我之前可以看到类加载,因此标志正在工作).
看起来该函数获得了一个新的ID(2351 vs 2837),这意味着它被JVM视为"不同".
我如何确定JVM决定重新编译此函数的原因?
我想这归结为我如何确定ID改变的原因?标准是什么?
我尝试尽可能多地标记尽可能多的方法和类,但无济于事.
这是JRE 1.6.0_45-b06.
有关如何排除故障或获取更多信息的任何提示!:)
我从Java编译器收到一条我不明白的错误消息.我在OSX 10.6,10.9和Ubuntu 14.04上使用Java 6和7测试了我的代码.当我使用Eclipse调试器或解释器(使用-Xint选项)运行时,一切运行正常.否则,我收到以下消息:
Java 1.6:
Invalid memory access of location 0x8 rip=0x1024e9660
Run Code Online (Sandbox Code Playgroud)
Java 1.7:
#
# A fatal error has been detected by the Java Runtime Environment:
#
# SIGSEGV (0xb) at pc=0x000000010f7a8262, pid=20344, tid=18179
#
# JRE version: Java(TM) SE Runtime Environment (7.0_60-b19) (build 1.7.0_60-b19)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (24.60-b09 mixed mode bsd-amd64 compressed oops)
# Problematic frame:
# V [libjvm.dylib+0x3a8262] PhaseIdealLoop::idom_no_update(Node*) const+0x12
#
# Failed to write core dump. Core dumps have been …Run Code Online (Sandbox Code Playgroud) 对于堆上和堆外分配.在堆上 - 在三个主要垃圾收集器的上下文中:CMS,Parallel Old和G1.
我所知道的(或者我认为我知道)到目前为止:
-XX:ObjectAlignmentInBytes.对于CMS,我发现的唯一相关信息是
自然旧的空间PLAB模仿索引自由列表空间的结构.每个线程预先分配一定数量的每个大小的块,低于257个堆字(从全局空间分配的大块).
来自http://blog.ragozin.info/2011/11/java-gc-hotspots-cms-promotion-buffers.html.据我所知,提到"全球空间"是主要的旧空间.
问题:
UPD.讨论主题:https://groups.google.com/forum/#!topic/mechanical-sympathy/ A- RImwuiFZE
java memory-management jvm-hotspot heap-fragmentation memory-fragmentation
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,它们之间的主要区别是什么?他们有不同的运行时标志集吗?
我知道Microsoft .NET使用CLR作为JIT编译器,而Java具有Hotspot.它们之间有什么区别?
如何大,以字节为单位,是一个盒装的原始状java.lang.Integer或java.lang.CharacterJava中?
An int是4个字节,典型的指针也是4个字节(如果没有被JVM压缩).那么整数(没有缓存)的成本是4 bytes + 4 bytes = 8 bytes多少?盒子对象中是否还有任何隐藏字段或者对象产生的额外开销(即,我不知道对象的一般成本?).
我对缓存问题不感兴趣.我知道JVM会缓存某个范围内的整数.
可以重新解释这个问题:用于盒装值与原始值的内存量相乘的最大因子是多少?
编辑:我明白存在JVM的多个实现.典型的32位HotSpot实现的典型成本是多少?
Java中的对象的实例变量是存储在JVM的堆栈或方法区域中的吗?
另外,我们为多个线程设置了不同的实例变量吗?
如果它存储在方法区域中,实例变量与静态变量存储的不同之处是什么?
我从一些文档中读到,Hotspot VM利用名为Oop Maps的数据结构来管理VM中的所有OOP.我的问题是,这个Oop Map数据结构何时生成?在编译时还是运行时?任何有关此问题的进一步详细文件都将受到欢迎.感谢你们.