Mercurial > hg > truffle
comparison src/share/vm/code/nmethod.cpp @ 941:8b46c4d82093
4957990: Perm heap bloat in JVM
Summary: Treat ProfileData in MDO's as a source of weak, not strong, roots. Fixes the bug for stop-world collection -- the case of concurrent collection will be fixed separately.
Reviewed-by: jcoomes, jmasa, kvn, never
author | ysr |
---|---|
date | Wed, 02 Sep 2009 00:04:29 -0700 |
parents | 98cb887364d3 |
children | b1606b3c0a8a |
comparison
equal
deleted
inserted
replaced
940:8624da129f0b | 941:8b46c4d82093 |
---|---|
1077 " unloadable], methodOop(" INTPTR_FORMAT | 1077 " unloadable], methodOop(" INTPTR_FORMAT |
1078 "), cause(" INTPTR_FORMAT ")", | 1078 "), cause(" INTPTR_FORMAT ")", |
1079 this, (address)_method, (address)cause); | 1079 this, (address)_method, (address)cause); |
1080 cause->klass()->print(); | 1080 cause->klass()->print(); |
1081 } | 1081 } |
1082 // Unlink the osr method, so we do not look this up again | |
1083 if (is_osr_method()) { | |
1084 invalidate_osr_method(); | |
1085 } | |
1082 // If _method is already NULL the methodOop is about to be unloaded, | 1086 // If _method is already NULL the methodOop is about to be unloaded, |
1083 // so we don't have to break the cycle. Note that it is possible to | 1087 // so we don't have to break the cycle. Note that it is possible to |
1084 // have the methodOop live here, in case we unload the nmethod because | 1088 // have the methodOop live here, in case we unload the nmethod because |
1085 // it is pointing to some oop (other than the methodOop) being unloaded. | 1089 // it is pointing to some oop (other than the methodOop) being unloaded. |
1086 if (_method != NULL) { | 1090 if (_method != NULL) { |
1146 // They never become zombie/non-entrant, so the nmethod sweeper will never remove | 1150 // They never become zombie/non-entrant, so the nmethod sweeper will never remove |
1147 // them. Instead the entry_bci is set to InvalidOSREntryBci, so the osr nmethod | 1151 // them. Instead the entry_bci is set to InvalidOSREntryBci, so the osr nmethod |
1148 // will never be used anymore. That the nmethods only gets removed when class unloading | 1152 // will never be used anymore. That the nmethods only gets removed when class unloading |
1149 // happens, make life much simpler, since the nmethods are not just going to disappear | 1153 // happens, make life much simpler, since the nmethods are not just going to disappear |
1150 // out of the blue. | 1154 // out of the blue. |
1151 if (is_osr_only_method()) { | 1155 if (is_osr_method()) { |
1152 if (osr_entry_bci() != InvalidOSREntryBci) { | 1156 if (osr_entry_bci() != InvalidOSREntryBci) { |
1153 // only log this once | 1157 // only log this once |
1154 log_state_change(state); | 1158 log_state_change(state); |
1155 } | 1159 } |
1156 invalidate_osr_method(); | 1160 invalidate_osr_method(); |
1518 } | 1522 } |
1519 } | 1523 } |
1520 #endif // !PRODUCT | 1524 #endif // !PRODUCT |
1521 } | 1525 } |
1522 | 1526 |
1527 // This method is called twice during GC -- once while | |
1528 // tracing the "active" nmethods on thread stacks during | |
1529 // the (strong) marking phase, and then again when walking | |
1530 // the code cache contents during the weak roots processing | |
1531 // phase. The two uses are distinguished by means of the | |
1532 // do_nmethods() method in the closure "f" below -- which | |
1533 // answers "yes" in the first case, and "no" in the second | |
1534 // case. We want to walk the weak roots in the nmethod | |
1535 // only in the second case. The weak roots in the nmethod | |
1536 // are the oops in the ExceptionCache and the InlineCache | |
1537 // oops. | |
1523 void nmethod::oops_do(OopClosure* f) { | 1538 void nmethod::oops_do(OopClosure* f) { |
1524 // make sure the oops ready to receive visitors | 1539 // make sure the oops ready to receive visitors |
1525 assert(!is_zombie() && !is_unloaded(), | 1540 assert(!is_zombie() && !is_unloaded(), |
1526 "should not call follow on zombie or unloaded nmethod"); | 1541 "should not call follow on zombie or unloaded nmethod"); |
1527 | 1542 |
1536 // (See comment above.) | 1551 // (See comment above.) |
1537 } | 1552 } |
1538 | 1553 |
1539 // Compiled code | 1554 // Compiled code |
1540 f->do_oop((oop*) &_method); | 1555 f->do_oop((oop*) &_method); |
1541 ExceptionCache* ec = exception_cache(); | 1556 if (!f->do_nmethods()) { |
1542 while(ec != NULL) { | 1557 // weak roots processing phase -- update ExceptionCache oops |
1543 f->do_oop((oop*)ec->exception_type_addr()); | 1558 ExceptionCache* ec = exception_cache(); |
1544 ec = ec->next(); | 1559 while(ec != NULL) { |
1545 } | 1560 f->do_oop((oop*)ec->exception_type_addr()); |
1561 ec = ec->next(); | |
1562 } | |
1563 } // Else strong roots phase -- skip oops in ExceptionCache | |
1546 | 1564 |
1547 RelocIterator iter(this, low_boundary); | 1565 RelocIterator iter(this, low_boundary); |
1566 | |
1548 while (iter.next()) { | 1567 while (iter.next()) { |
1549 if (iter.type() == relocInfo::oop_type ) { | 1568 if (iter.type() == relocInfo::oop_type ) { |
1550 oop_Relocation* r = iter.oop_reloc(); | 1569 oop_Relocation* r = iter.oop_reloc(); |
1551 // In this loop, we must only follow those oops directly embedded in | 1570 // In this loop, we must only follow those oops directly embedded in |
1552 // the code. Other oops (oop_index>0) are seen as part of scopes_oops. | 1571 // the code. Other oops (oop_index>0) are seen as part of scopes_oops. |
1553 assert(1 == (r->oop_is_immediate()) + (r->oop_addr() >= oops_begin() && r->oop_addr() < oops_end()), "oop must be found in exactly one place"); | 1572 assert(1 == (r->oop_is_immediate()) + |
1573 (r->oop_addr() >= oops_begin() && r->oop_addr() < oops_end()), | |
1574 "oop must be found in exactly one place"); | |
1554 if (r->oop_is_immediate() && r->oop_value() != NULL) { | 1575 if (r->oop_is_immediate() && r->oop_value() != NULL) { |
1555 f->do_oop(r->oop_addr()); | 1576 f->do_oop(r->oop_addr()); |
1556 } | 1577 } |
1557 } | 1578 } |
1558 } | 1579 } |