Java 试图理解JVM';s的JIT行为
我正在玩-XX:+printcomilation标志。在一个紧密的循环中运行一个相对复杂的操作大约3天,我已经完成了26K次迭代,这些迭代都是相同的,但我仍然看到JIT的发生:Java 试图理解JVM';s的JIT行为,java,jvm,jit,Java,Jvm,Jit,我正在玩-XX:+printcomilation标志。在一个紧密的循环中运行一个相对复杂的操作大约3天,我已经完成了26K次迭代,这些迭代都是相同的,但我仍然看到JIT的发生: 135245570 11820 3 org.apache.xerces.impl.XMLDTDScannerImpl::setDTDHandler (6 bytes) made zombie 135245571 12195 3 oracle.net.ano.AnoCom
135245570 11820 3 org.apache.xerces.impl.XMLDTDScannerImpl::setDTDHandler (6 bytes) made zombie
135245571 12195 3 oracle.net.ano.AnoComm::i (11 bytes)
135245592 9715 ! 4 org.springframework.jdbc.support.JdbcUtils::closeStatement (41 bytes) made zombie
135245592 10054 ! 3 com.google.common.cache.LocalCache$Segment::get (210 bytes) made zombie
135245605 12196 3 oracle.jdbc.driver.T4CMAREngineStream::marshalB1Array (14 bytes)
136786126 12197 ! 4 net.sf.log4jdbc.sql.jdbcapi.ConnectionSpy::prepareStatement (69 bytes)
136786158 9045 ! 3 net.sf.log4jdbc.sql.jdbcapi.ConnectionSpy::prepareStatement (69 bytes) made not entrant
137012330 12198 ! 3 java.net.InetAddress::getAddressesFromNameService (245 bytes)
137012337 12201 3 java.net.URI$Parser::parse (265 bytes)
137012343 12203 3 java.net.URI::access$1002 (7 bytes)
137012344 11499 3 sun.nio.cs.US_ASCII$Decoder::decode (62 bytes) made zombie
137012347 12202 ! 3 java.net.URI$Parser::parseAuthority (256 bytes)
137012350 12199 ! 3 java.net.InetAddress::checkLookupTable (99 bytes)
137012352 12200 ! 3 java.net.InetAddress::cacheAddresses (52 bytes)
137045611 12204 4 java.util.concurrent.Executors$RunnableAdapter::call (14 bytes)
137045710 9432 3 java.util.concurrent.Executors$RunnableAdapter::call (14 bytes) made not entrant
137048986 12205 3 oracle.jdbc.driver.T4CMAREngine::marshalKEYVAL (129 bytes)
137077651 12206 ! 3 oracle.jdbc.driver.OracleCallableStatementWrapper::registerOutParameter (297 bytes)
137077666 12207 ! 3 oracle.jdbc.driver.OracleCallableStatement::registerOutParameter (329 bytes)
138816046 12208 4 oracle.net.ano.AnoComm::a (34 bytes)
138816051 11867 3 oracle.net.ano.AnoComm::a (34 bytes) made not entrant
138816051 10955 3 java.util.Hashtable$Enumerator::next (27 bytes) made zombie
138884752 12209 3 java.net.AbstractPlainSocketImpl::finalize (5 bytes)
发生这种情况的原因是什么?即使代码路径始终相同,并且Hotspot不太可能找到新的热点(这可能会触发jitted块的大规模失效),它仍然可以由于其他原因使它已jitted的一些块失效
这取决于JIT引擎是如何实现的,看看那些
制造的僵尸
和制造的非进入者
,很明显,您遇到了一些使JIT生成的代码块无效并触发新编译的特定条件。即使代码路径始终相同,Hotspot也不太可能找到新的热点(这可能会触发JIT块的大规模无效),由于其他原因,它仍然可以使某些已jit的块无效
这取决于JIT引擎是如何实现的,看看那些
制造的僵尸
和制造的非进入者
,你显然遇到了一些特定的条件,这些条件使JIT生成的代码块无效并触发了新的编译。“相对复杂的操作”和“紧密的循环”这是一个矛盾。如果操作在循环内,则可能是复杂操作或紧密循环。在前一种情况下,可以想象它仍然偶尔采用不同的代码路径。所谓紧循环,我的意思是它只是一遍又一遍地做同样的事情。操作相对复杂(读写多个表),但应该始终采用相同的代码路径。“相对复杂的操作”和“紧密循环”是矛盾的。如果操作在循环内,则可能是复杂操作或紧密循环。在前一种情况下,可以想象它仍然偶尔采用不同的代码路径。所谓紧循环,我的意思是它只是一遍又一遍地做同样的事情。该操作相对复杂(读取和写入多个表),但它应该始终采用相同的代码路径。但什么会使哈希表枚举器下一个方法无效?我运行了大约2周,重新编译速度明显减慢,但仍然一直在发生。但是什么会使哈希表枚举器下一个方法无效呢?我运行了大约2周,重新编译的速度明显减慢,但仍然一直在发生。