80 #else |
80 #else |
81 |
81 |
82 #include "runtime/mutexLocker.hpp" |
82 #include "runtime/mutexLocker.hpp" |
83 #include "runtime/threadCritical.hpp" |
83 #include "runtime/threadCritical.hpp" |
84 #include "services/mallocTracker.hpp" |
84 #include "services/mallocTracker.hpp" |
|
85 #include "services/threadStackTracker.hpp" |
85 #include "services/virtualMemoryTracker.hpp" |
86 #include "services/virtualMemoryTracker.hpp" |
86 |
87 |
87 extern volatile bool NMT_stack_walkable; |
88 extern volatile bool NMT_stack_walkable; |
88 |
89 |
89 #define CURRENT_PC ((MemTracker::tracking_level() == NMT_detail && NMT_stack_walkable) ? \ |
90 #define CURRENT_PC ((MemTracker::tracking_level() == NMT_detail && NMT_stack_walkable) ? \ |
239 if (tracking_level() < NMT_summary) return; |
240 if (tracking_level() < NMT_summary) return; |
240 VirtualMemoryTracker::set_reserved_region_type((address)addr, flag); |
241 VirtualMemoryTracker::set_reserved_region_type((address)addr, flag); |
241 } |
242 } |
242 } |
243 } |
243 |
244 |
244 #ifdef _AIX |
245 static void record_thread_stack(void* addr, size_t size) { |
245 // See JDK-8202772 - temporarily disable thread stack tracking on AIX. |
246 if (tracking_level() < NMT_summary) return; |
246 static inline void record_thread_stack(void* addr, size_t size) {} |
247 if (addr != NULL) { |
247 static inline void release_thread_stack(void* addr, size_t size) {} |
248 ThreadStackTracker::new_thread_stack((address)addr, size, CALLER_PC); |
248 #else |
|
249 static inline void record_thread_stack(void* addr, size_t size) { |
|
250 if (tracking_level() < NMT_summary) return; |
|
251 if (addr != NULL) { |
|
252 // uses thread stack malloc slot for book keeping number of threads |
|
253 MallocMemorySummary::record_malloc(0, mtThreadStack); |
|
254 record_virtual_memory_reserve(addr, size, CALLER_PC, mtThreadStack); |
|
255 } |
249 } |
256 } |
250 } |
257 |
251 |
258 static inline void release_thread_stack(void* addr, size_t size) { |
252 static inline void release_thread_stack(void* addr, size_t size) { |
259 if (tracking_level() < NMT_summary) return; |
253 if (tracking_level() < NMT_summary) return; |
260 if (addr != NULL) { |
254 if (addr != NULL) { |
261 // uses thread stack malloc slot for book keeping number of threads |
255 ThreadStackTracker::delete_thread_stack((address)addr, size); |
262 MallocMemorySummary::record_free(0, mtThreadStack); |
256 } |
263 ThreadCritical tc; |
257 } |
264 if (tracking_level() < NMT_summary) return; |
|
265 VirtualMemoryTracker::remove_released_region((address)addr, size); |
|
266 } |
|
267 } |
|
268 #endif |
|
269 |
258 |
270 // Query lock is used to synchronize the access to tracking data. |
259 // Query lock is used to synchronize the access to tracking data. |
271 // So far, it is only used by JCmd query, but it may be used by |
260 // So far, it is only used by JCmd query, but it may be used by |
272 // other tools. |
261 // other tools. |
273 static inline Mutex* query_lock() { |
262 static inline Mutex* query_lock() { |