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 |