Mercurial > hg > truffle
comparison src/share/vm/runtime/thread.cpp @ 6882:716c64bda5ba
7199092: NMT: NMT needs to deal overlapped virtual memory ranges
Summary: Enhanced virtual memory tracking to track committed regions as well as reserved regions, so NMT now can generate virtual memory map.
Reviewed-by: acorn, coleenp
author | zgu |
---|---|
date | Fri, 19 Oct 2012 21:40:07 -0400 |
parents | 7b5885dadbdc |
children | a1b8cf9cf970 |
comparison
equal
deleted
inserted
replaced
6879:8ebcedb7604d | 6882:716c64bda5ba |
---|---|
321 // | 321 // |
322 // set up any platform-specific state. | 322 // set up any platform-specific state. |
323 os::initialize_thread(this); | 323 os::initialize_thread(this); |
324 | 324 |
325 #if INCLUDE_NMT | 325 #if INCLUDE_NMT |
326 // record thread's native stack, stack grows downward | 326 // record thread's native stack, stack grows downward |
327 if (MemTracker::is_on()) { | 327 address stack_low_addr = stack_base() - stack_size(); |
328 address stack_low_addr = stack_base() - stack_size(); | 328 MemTracker::record_thread_stack(stack_low_addr, stack_size(), this, |
329 MemTracker::record_thread_stack(stack_low_addr, stack_size(), this, | |
330 CURRENT_PC); | 329 CURRENT_PC); |
331 } | |
332 #endif // INCLUDE_NMT | 330 #endif // INCLUDE_NMT |
333 } | 331 } |
334 | 332 |
335 | 333 |
336 Thread::~Thread() { | 334 Thread::~Thread() { |
343 // not proper way to enforce that. | 341 // not proper way to enforce that. |
344 #if INCLUDE_NMT | 342 #if INCLUDE_NMT |
345 if (_stack_base != NULL) { | 343 if (_stack_base != NULL) { |
346 address low_stack_addr = stack_base() - stack_size(); | 344 address low_stack_addr = stack_base() - stack_size(); |
347 MemTracker::release_thread_stack(low_stack_addr, stack_size(), this); | 345 MemTracker::release_thread_stack(low_stack_addr, stack_size(), this); |
346 #ifdef ASSERT | |
347 set_stack_base(NULL); | |
348 #endif | |
348 } | 349 } |
349 #endif // INCLUDE_NMT | 350 #endif // INCLUDE_NMT |
350 | 351 |
351 // deallocate data structures | 352 // deallocate data structures |
352 delete resource_area(); | 353 delete resource_area(); |
1519 JavaThread::~JavaThread() { | 1520 JavaThread::~JavaThread() { |
1520 if (TraceThreadEvents) { | 1521 if (TraceThreadEvents) { |
1521 tty->print_cr("terminate thread %p", this); | 1522 tty->print_cr("terminate thread %p", this); |
1522 } | 1523 } |
1523 | 1524 |
1524 // Info NMT that this JavaThread is exiting, its memory | 1525 // By now, this thread should already be invisible to safepoint, |
1525 // recorder should be collected | 1526 // and its per-thread recorder also collected. |
1526 assert(!is_safepoint_visible(), "wrong state"); | 1527 assert(!is_safepoint_visible(), "wrong state"); |
1527 MemTracker::thread_exiting(this); | 1528 #if INCLUDE_NMT |
1529 assert(get_recorder() == NULL, "Already collected"); | |
1530 #endif // INCLUDE_NMT | |
1528 | 1531 |
1529 // JSR166 -- return the parker to the free list | 1532 // JSR166 -- return the parker to the free list |
1530 Parker::Release(_parker); | 1533 Parker::Release(_parker); |
1531 _parker = NULL ; | 1534 _parker = NULL ; |
1532 | 1535 |
2423 } | 2426 } |
2424 } | 2427 } |
2425 } | 2428 } |
2426 | 2429 |
2427 void JavaThread::remove_stack_guard_pages() { | 2430 void JavaThread::remove_stack_guard_pages() { |
2431 assert(Thread::current() == this, "from different thread"); | |
2428 if (_stack_guard_state == stack_guard_unused) return; | 2432 if (_stack_guard_state == stack_guard_unused) return; |
2429 address low_addr = stack_base() - stack_size(); | 2433 address low_addr = stack_base() - stack_size(); |
2430 size_t len = (StackYellowPages + StackRedPages) * os::vm_page_size(); | 2434 size_t len = (StackYellowPages + StackRedPages) * os::vm_page_size(); |
2431 | 2435 |
2432 if (os::allocate_stack_guard_pages()) { | 2436 if (os::allocate_stack_guard_pages()) { |
4091 // of this thread since it is removed from the queue. | 4095 // of this thread since it is removed from the queue. |
4092 p->set_terminated_value(); | 4096 p->set_terminated_value(); |
4093 | 4097 |
4094 // Now, this thread is not visible to safepoint | 4098 // Now, this thread is not visible to safepoint |
4095 p->set_safepoint_visible(false); | 4099 p->set_safepoint_visible(false); |
4096 | 4100 // once the thread becomes safepoint invisible, we can not use its per-thread |
4101 // recorder. And Threads::do_threads() no longer walks this thread, so we have | |
4102 // to release its per-thread recorder here. | |
4103 MemTracker::thread_exiting(p); | |
4097 } // unlock Threads_lock | 4104 } // unlock Threads_lock |
4098 | 4105 |
4099 // Since Events::log uses a lock, we grab it outside the Threads_lock | 4106 // Since Events::log uses a lock, we grab it outside the Threads_lock |
4100 Events::log(p, "Thread exited: " INTPTR_FORMAT, p); | 4107 Events::log(p, "Thread exited: " INTPTR_FORMAT, p); |
4101 } | 4108 } |