0
|
1 /*
|
|
2 * Copyright 1998-2007 Sun Microsystems, Inc. All Rights Reserved.
|
|
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
|
4 *
|
|
5 * This code is free software; you can redistribute it and/or modify it
|
|
6 * under the terms of the GNU General Public License version 2 only, as
|
|
7 * published by the Free Software Foundation.
|
|
8 *
|
|
9 * This code is distributed in the hope that it will be useful, but WITHOUT
|
|
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
12 * version 2 for more details (a copy is included in the LICENSE file that
|
|
13 * accompanied this code).
|
|
14 *
|
|
15 * You should have received a copy of the GNU General Public License version
|
|
16 * 2 along with this work; if not, write to the Free Software Foundation,
|
|
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
18 *
|
|
19 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
|
|
20 * CA 95054 USA or visit www.sun.com if you need additional information or
|
|
21 * have any questions.
|
|
22 *
|
|
23 */
|
|
24
|
|
25 # include "incls/_precompiled.incl"
|
|
26 # include "incls/_memprofiler.cpp.incl"
|
|
27
|
|
28 #ifndef PRODUCT
|
|
29
|
|
30 // --------------------------------------------------------
|
|
31 // MemProfilerTask
|
|
32
|
|
33 class MemProfilerTask : public PeriodicTask {
|
|
34 public:
|
|
35 MemProfilerTask(int interval_time) : PeriodicTask(interval_time) {}
|
|
36 void task();
|
|
37 };
|
|
38
|
|
39
|
|
40 void MemProfilerTask::task() {
|
|
41 // Get thread lock to provide mutual exclusion, and so we can iterate safely over the thread list.
|
|
42 MutexLocker mu(Threads_lock);
|
|
43 MemProfiler::do_trace();
|
|
44 }
|
|
45
|
|
46
|
|
47 //----------------------------------------------------------
|
|
48 // Implementation of MemProfiler
|
|
49
|
|
50 MemProfilerTask* MemProfiler::_task = NULL;
|
|
51 FILE* MemProfiler::_log_fp = NULL;
|
|
52
|
|
53
|
|
54 bool MemProfiler::is_active() {
|
|
55 return _task != NULL;
|
|
56 }
|
|
57
|
|
58
|
|
59 void MemProfiler::engage() {
|
|
60 const char *log_name = "mprofile.log";
|
|
61 if (!is_active()) {
|
|
62 // Create log file
|
|
63 _log_fp = fopen(log_name , "w+");
|
|
64 if (_log_fp == NULL) {
|
|
65 fatal1("MemProfiler: Cannot create log file: %s", log_name);
|
|
66 }
|
|
67 fprintf(_log_fp, "MemProfiler: sizes are in Kb, time is in seconds since startup\n\n");
|
|
68 fprintf(_log_fp, " time, #thr, #cls, heap, heap, perm, perm, code, hndls, rescs, oopmp\n");
|
|
69 fprintf(_log_fp, " used, total, used, total, total, total, total, total\n");
|
|
70 fprintf(_log_fp, "--------------------------------------------------------------------------\n");
|
|
71
|
|
72 _task = new MemProfilerTask(MemProfilingInterval);
|
|
73 _task->enroll();
|
|
74 }
|
|
75 }
|
|
76
|
|
77
|
|
78 void MemProfiler::disengage() {
|
|
79 if (!is_active()) return;
|
|
80 // Do one last trace at disengage time
|
|
81 do_trace();
|
|
82
|
|
83 // Close logfile
|
|
84 fprintf(_log_fp, "MemProfiler detached\n");
|
|
85 fclose(_log_fp);
|
|
86
|
|
87 // remove MemProfilerTask
|
|
88 assert(_task != NULL, "sanity check");
|
|
89 _task->disenroll();
|
|
90 delete _task;
|
|
91 _task = NULL;
|
|
92 }
|
|
93
|
|
94
|
|
95 void MemProfiler::do_trace() {
|
|
96 // Calculate thread local sizes
|
|
97 size_t handles_memory_usage = VMThread::vm_thread()->handle_area()->size_in_bytes();
|
|
98 size_t resource_memory_usage = VMThread::vm_thread()->resource_area()->size_in_bytes();
|
|
99 JavaThread *cur = Threads::first();
|
|
100 while (cur != NULL) {
|
|
101 handles_memory_usage += cur->handle_area()->size_in_bytes();
|
|
102 resource_memory_usage += cur->resource_area()->size_in_bytes();
|
|
103 cur = cur->next();
|
|
104 }
|
|
105
|
|
106 // Print trace line in log
|
|
107 fprintf(_log_fp, "%6.1f,%5d,%5d,%6ld,%6ld,%6ld,%6ld,",
|
|
108 os::elapsedTime(),
|
|
109 Threads::number_of_threads(),
|
|
110 SystemDictionary::number_of_classes(),
|
|
111 Universe::heap()->used() / K,
|
|
112 Universe::heap()->capacity() / K,
|
|
113 Universe::heap()->permanent_used() / HWperKB,
|
|
114 Universe::heap()->permanent_capacity() / HWperKB);
|
|
115
|
|
116 fprintf(_log_fp, "%6ld,", CodeCache::capacity() / K);
|
|
117
|
|
118 fprintf(_log_fp, "%6ld,%6ld,%6ld\n",
|
|
119 handles_memory_usage / K,
|
|
120 resource_memory_usage / K,
|
|
121 OopMapCache::memory_usage() / K);
|
|
122 fflush(_log_fp);
|
|
123 }
|
|
124
|
|
125 #endif
|