他的回复:
[quote]LD 发表于 2019-8-9 11:02而且部分版本的JVM有Bug,一旦Code Cache满了,则所有的编译功能都会被停止 这个部分版本 具体是指的哪些版本? 或是 哪些版本没有这个Bug 能否[/quote]触发问题时,函数位置0x481e00。反汇编后是CodeHeap的largest_free_block函数中的遍历链表的位置。和这个函数有关的BUG有一些,主要都和内存碎片有关反汇编地址(gdb) disassemble 0x481e00Dump of assembler code for function _ZNK8CodeHeap18largest_free_blockEv: 0x0000000000481d88 +0>:stpx29, x30, [sp,#-48]! 0x0000000000481d8c +4>:movx29, sp 0x0000000000481d90 +8>:stpx19, x20, [sp,#16] 0x0000000000481d94 +12>:strx21, [sp,#32] 0x0000000000481d98 +16>:ldrw1, [x0,#248] 0x0000000000481d9c +20>:ldrx20, [x0,#272] 0x0000000000481da0 +24>:movx19, x0 0x0000000000481da4 +28>:lslx20, x20, x1 0x0000000000481da8 +32>:bl0x8180b4 _ZNK12VirtualSpace13reserved_sizeEv> 0x0000000000481dac +36>:movx21, x0 0x0000000000481db0 +40>:movx0, x19 0x0000000000481db4 +44>:bl0x8180a4 _ZNK12VirtualSpace14committed_sizeEv> 0x0000000000481db8 +48>:ldrx3, [x19,#224] 0x0000000000481dbc +52>:ldrx2, [x19,#256] 0x0000000000481dc0 +56>:ldrw5, [x19,#248] 0x0000000000481dc4 +60>:subx2, x3, x2 0x0000000000481dc8 +64>:ldrx1, [x19,#272] 0x0000000000481dcc +68>:lslx2, x2, x5 0x0000000000481dd0 +72>:subx0, x0, x2 0x0000000000481dd4 +76>:lslx1, x1, x5 0x0000000000481dd8 +80>:subx4, x0, x1 0x0000000000481ddc +84>:subx4, x21, x4 0x0000000000481de0 +88>:subx4, x4, x20 0x0000000000481de4 +92>:cmpx4, x20 0x0000000000481de8 +96>:movx0, x4 0x0000000000481dec +100>:b.cs0x481e1c _ZNK8CodeHeap18largest_free_blockEv+148> 0x0000000000481df0 +104>:ldrx1, [x19,#264] 0x0000000000481df4 +108>:cbzx1, 0x481e2c _ZNK8CodeHeap18largest_free_blockEv+164> 0x0000000000481df8 +112>:movx2, #0x0 // #0 0x0000000000481dfc +116>:ldrx3, [x1] 0x0000000000481e00 +120>:ldrx1, [x1,#16] 0x0000000000481e04 +124>:cmpx2, x3 0x0000000000481e08 +128>:cselx2, x2, x3, cs 0x0000000000481e0c +132>:cbnzx1, 0x481dfc _ZNK8CodeHeap18largest_free_blockEv+116> 0x0000000000481e10 +136>:lslx0, x2, x5 0x0000000000481e14 +140>:cmpx0, x4 0x0000000000481e18 +144>:cselx0, x0, x4, cs 0x0000000000481e1c +148>:ldpx19, x20, [sp,#16] 0x0000000000481e20 +152>:ldrx21, [sp,#32] 0x0000000000481e24 +156>:lfree_sz足够的,但是FreeBlock链表中没有足够长的连续长度。 size_t CodeHeap::largest_free_block() const { // First check unused space excluding free blocks. size_t free_sz = size(_free_segments); size_t unused = max_capacity() - allocated_capacity() - free_sz; if (unused >= free_sz) return unused; // Now check largest free block. size_t len = 0; for (FreeBlock* b = _freelist; b != NULL; b = b->link()) { if (b->length() > len) len = b->length(); } return MAX2(unused, size(len));}下面是其中一个相关的Bug,解决版本是7u101。https://bugs.java.com/bugdatabase/view_bug.do?bug_id=8006952