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 }