Mercurial > hg > graal-compiler
comparison src/share/vm/services/management.cpp @ 4844:bf864f701a4a
7066129: GarbageCollectorMXBean#getLastGcInfo leaks native memory
Summary: Make GCStatInfo a resource object
Reviewed-by: phh, coleenp
author | dsamersoff |
---|---|
date | Wed, 25 Jan 2012 02:29:05 +0400 |
parents | 4f25538b54c9 |
children | a42c07c38c47 |
comparison
equal
deleted
inserted
replaced
4842:583b428aa858 | 4844:bf864f701a4a |
---|---|
2045 GCMemoryManager* mgr = get_gc_memory_manager_from_jobject(obj, CHECK); | 2045 GCMemoryManager* mgr = get_gc_memory_manager_from_jobject(obj, CHECK); |
2046 | 2046 |
2047 // Make a copy of the last GC statistics | 2047 // Make a copy of the last GC statistics |
2048 // GC may occur while constructing the last GC information | 2048 // GC may occur while constructing the last GC information |
2049 int num_pools = MemoryService::num_memory_pools(); | 2049 int num_pools = MemoryService::num_memory_pools(); |
2050 GCStatInfo* stat = new GCStatInfo(num_pools); | 2050 GCStatInfo stat(num_pools); |
2051 if (mgr->get_last_gc_stat(stat) == 0) { | 2051 if (mgr->get_last_gc_stat(&stat) == 0) { |
2052 gc_stat->gc_index = 0; | 2052 gc_stat->gc_index = 0; |
2053 return; | 2053 return; |
2054 } | 2054 } |
2055 | 2055 |
2056 gc_stat->gc_index = stat->gc_index(); | 2056 gc_stat->gc_index = stat.gc_index(); |
2057 gc_stat->start_time = Management::ticks_to_ms(stat->start_time()); | 2057 gc_stat->start_time = Management::ticks_to_ms(stat.start_time()); |
2058 gc_stat->end_time = Management::ticks_to_ms(stat->end_time()); | 2058 gc_stat->end_time = Management::ticks_to_ms(stat.end_time()); |
2059 | 2059 |
2060 // Current implementation does not have GC extension attributes | 2060 // Current implementation does not have GC extension attributes |
2061 gc_stat->num_gc_ext_attributes = 0; | 2061 gc_stat->num_gc_ext_attributes = 0; |
2062 | 2062 |
2063 // Fill the arrays of MemoryUsage objects with before and after GC | 2063 // Fill the arrays of MemoryUsage objects with before and after GC |
2071 num_pools, | 2071 num_pools, |
2072 CHECK); | 2072 CHECK); |
2073 objArrayHandle usage_after_gc_ah(THREAD, au); | 2073 objArrayHandle usage_after_gc_ah(THREAD, au); |
2074 | 2074 |
2075 for (int i = 0; i < num_pools; i++) { | 2075 for (int i = 0; i < num_pools; i++) { |
2076 Handle before_usage = MemoryService::create_MemoryUsage_obj(stat->before_gc_usage_for_pool(i), CHECK); | 2076 Handle before_usage = MemoryService::create_MemoryUsage_obj(stat.before_gc_usage_for_pool(i), CHECK); |
2077 Handle after_usage; | 2077 Handle after_usage; |
2078 | 2078 |
2079 MemoryUsage u = stat->after_gc_usage_for_pool(i); | 2079 MemoryUsage u = stat.after_gc_usage_for_pool(i); |
2080 if (u.max_size() == 0 && u.used() > 0) { | 2080 if (u.max_size() == 0 && u.used() > 0) { |
2081 // If max size == 0, this pool is a survivor space. | 2081 // If max size == 0, this pool is a survivor space. |
2082 // Set max size = -1 since the pools will be swapped after GC. | 2082 // Set max size = -1 since the pools will be swapped after GC. |
2083 MemoryUsage usage(u.init_size(), u.used(), u.committed(), (size_t)-1); | 2083 MemoryUsage usage(u.init_size(), u.used(), u.committed(), (size_t)-1); |
2084 after_usage = MemoryService::create_MemoryUsage_obj(usage, CHECK); | 2084 after_usage = MemoryService::create_MemoryUsage_obj(usage, CHECK); |
2085 } else { | 2085 } else { |
2086 after_usage = MemoryService::create_MemoryUsage_obj(stat->after_gc_usage_for_pool(i), CHECK); | 2086 after_usage = MemoryService::create_MemoryUsage_obj(stat.after_gc_usage_for_pool(i), CHECK); |
2087 } | 2087 } |
2088 usage_before_gc_ah->obj_at_put(i, before_usage()); | 2088 usage_before_gc_ah->obj_at_put(i, before_usage()); |
2089 usage_after_gc_ah->obj_at_put(i, after_usage()); | 2089 usage_after_gc_ah->obj_at_put(i, after_usage()); |
2090 } | 2090 } |
2091 | 2091 |