1 /* 2 * Copyright (c) 2003, 2011, Oracle and/or its affiliates. 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. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26 #include <jni.h> 27 #include "jvm.h" 28 #include "management.h" 29 #include "sun_management_VMManagementImpl.h" 30 31 #define MAX_VERSION_LEN 20 32 33 JNIEXPORT jstring JNICALL 34 Java_sun_management_VMManagementImpl_getVersion0 35 (JNIEnv *env, jclass dummy) 36 { 37 char buf[MAX_VERSION_LEN]; 38 jstring version_string = NULL; 39 40 unsigned int major = ((unsigned int) jmm_version & 0x0FFF0000) >> 16; 41 unsigned int minor = ((unsigned int) jmm_version & 0xFF00) >> 8; 42 43 // for internal use 44 unsigned int micro = (unsigned int) jmm_version & 0xFF; 45 46 sprintf(buf, "%d.%d", major, minor); 47 version_string = (*env)->NewStringUTF(env, buf); 48 return version_string; 49 } 50 51 static void setStaticBooleanField 52 (JNIEnv* env, jclass cls, const char* name, jboolean value) 53 { 54 jfieldID fid; 55 fid = (*env)->GetStaticFieldID(env, cls, name, "Z"); 56 if (fid != 0) { 57 (*env)->SetStaticBooleanField(env, cls, fid, value); 58 } 59 } 60 61 JNIEXPORT void JNICALL 62 Java_sun_management_VMManagementImpl_initOptionalSupportFields 63 (JNIEnv *env, jclass cls) 64 { 65 jmmOptionalSupport mos; 66 jint ret = jmm_interface->GetOptionalSupport(env, &mos); 67 68 jboolean value; 69 70 value = mos.isCompilationTimeMonitoringSupported; 71 setStaticBooleanField(env, cls, "compTimeMonitoringSupport", value); 72 73 value = mos.isThreadContentionMonitoringSupported; 74 setStaticBooleanField(env, cls, "threadContentionMonitoringSupport", value); 75 76 value = mos.isCurrentThreadCpuTimeSupported; 77 setStaticBooleanField(env, cls, "currentThreadCpuTimeSupport", value); 78 79 value = mos.isOtherThreadCpuTimeSupported; 80 setStaticBooleanField(env, cls, "otherThreadCpuTimeSupport", value); 81 82 value = mos.isBootClassPathSupported; 83 setStaticBooleanField(env, cls, "bootClassPathSupport", value); 84 85 if (jmm_version >= JMM_VERSION_1_1) { 86 value = mos.isObjectMonitorUsageSupported; 87 setStaticBooleanField(env, cls, "objectMonitorUsageSupport", value); 88 89 value = mos.isSynchronizerUsageSupported; 90 setStaticBooleanField(env, cls, "synchronizerUsageSupport", value); 91 } else { 92 setStaticBooleanField(env, cls, "objectMonitorUsageSupport", JNI_FALSE); 93 setStaticBooleanField(env, cls, "synchronizerUsageSupport", JNI_FALSE); 94 } 95 96 value = mos.isThreadAllocatedMemorySupported; 97 setStaticBooleanField(env, cls, "threadAllocatedMemorySupport", value); 98 99 if ((jmm_version > JMM_VERSION_1_2) || 100 (jmm_version == JMM_VERSION_1_2 && ((jmm_version&0xFF) >= 1))) { 101 setStaticBooleanField(env, cls, "gcNotificationSupport", JNI_TRUE); 102 } else { 103 setStaticBooleanField(env, cls, "gcNotificationSupport", JNI_FALSE); 104 } 105 } 106 107 JNIEXPORT jobjectArray JNICALL 108 Java_sun_management_VMManagementImpl_getVmArguments0 109 (JNIEnv *env, jobject dummy) 110 { 111 return jmm_interface->GetInputArgumentArray(env); 112 } 113 114 JNIEXPORT jlong JNICALL 115 Java_sun_management_VMManagementImpl_getTotalClassCount 116 (JNIEnv *env, jobject dummy) 117 { 118 /* JMM_CLASS_LOADED_COUNT is the total number of classes loaded */ 119 jlong count = jmm_interface->GetLongAttribute(env, NULL, 120 JMM_CLASS_LOADED_COUNT); 121 return count; 122 } 123 124 JNIEXPORT jlong JNICALL 125 Java_sun_management_VMManagementImpl_getUnloadedClassCount 126 (JNIEnv *env, jobject dummy) 127 { 128 /* JMM_CLASS_UNLOADED_COUNT is the total number of classes unloaded */ 129 jlong count = jmm_interface->GetLongAttribute(env, NULL, 130 JMM_CLASS_UNLOADED_COUNT); 131 return count; 132 } 133 134 JNIEXPORT jboolean JNICALL 135 Java_sun_management_VMManagementImpl_getVerboseGC 136 (JNIEnv *env, jobject dummy) 137 { 138 return jmm_interface->GetBoolAttribute(env, JMM_VERBOSE_GC); 139 } 140 141 JNIEXPORT jboolean JNICALL 142 Java_sun_management_VMManagementImpl_getVerboseClass 143 (JNIEnv *env, jobject dummy) 144 { 145 return jmm_interface->GetBoolAttribute(env, JMM_VERBOSE_CLASS); 146 } 147 148 JNIEXPORT jlong JNICALL 149 Java_sun_management_VMManagementImpl_getTotalThreadCount 150 (JNIEnv *env, jobject dummy) 151 { 152 return jmm_interface->GetLongAttribute(env, NULL, 153 JMM_THREAD_TOTAL_COUNT); 154 } 155 156 JNIEXPORT jint JNICALL 157 Java_sun_management_VMManagementImpl_getLiveThreadCount 158 (JNIEnv *env, jobject dummy) 159 { 160 jlong count = jmm_interface->GetLongAttribute(env, NULL, 161 JMM_THREAD_LIVE_COUNT); 162 return (jint) count; 163 } 164 165 JNIEXPORT jint JNICALL 166 Java_sun_management_VMManagementImpl_getPeakThreadCount 167 (JNIEnv *env, jobject dummy) 168 { 169 jlong count = jmm_interface->GetLongAttribute(env, NULL, 170 JMM_THREAD_PEAK_COUNT); 171 return (jint) count; 172 } 173 174 JNIEXPORT jint JNICALL 175 Java_sun_management_VMManagementImpl_getDaemonThreadCount 176 (JNIEnv *env, jobject dummy) 177 { 178 jlong count = jmm_interface->GetLongAttribute(env, NULL, 179 JMM_THREAD_DAEMON_COUNT); 180 return (jint) count; 181 } 182 183 JNIEXPORT jlong JNICALL 184 Java_sun_management_VMManagementImpl_getTotalCompileTime 185 (JNIEnv *env, jobject dummy) 186 { 187 return jmm_interface->GetLongAttribute(env, NULL, 188 JMM_COMPILE_TOTAL_TIME_MS); 189 } 190 191 JNIEXPORT jlong JNICALL 192 Java_sun_management_VMManagementImpl_getStartupTime 193 (JNIEnv *env, jobject dummy) 194 { 195 return jmm_interface->GetLongAttribute(env, NULL, 196 JMM_JVM_INIT_DONE_TIME_MS); 197 } 198 199 JNIEXPORT jboolean JNICALL 200 Java_sun_management_VMManagementImpl_isThreadContentionMonitoringEnabled 201 (JNIEnv *env, jobject dummy) 202 { 203 return jmm_interface->GetBoolAttribute(env, 204 JMM_THREAD_CONTENTION_MONITORING); 205 } 206 207 JNIEXPORT jboolean JNICALL 208 Java_sun_management_VMManagementImpl_isThreadCpuTimeEnabled 209 (JNIEnv *env, jobject dummy) 210 { 211 return jmm_interface->GetBoolAttribute(env, JMM_THREAD_CPU_TIME); 212 } 213 214 JNIEXPORT jboolean JNICALL 215 Java_sun_management_VMManagementImpl_isThreadAllocatedMemoryEnabled 216 (JNIEnv *env, jobject dummy) 217 { 218 return jmm_interface->GetBoolAttribute(env, JMM_THREAD_ALLOCATED_MEMORY); 219 } 220 221 JNIEXPORT jint JNICALL 222 Java_sun_management_VMManagementImpl_getProcessId 223 (JNIEnv *env, jobject dummy) 224 { 225 jlong pid = jmm_interface->GetLongAttribute(env, NULL, 226 JMM_OS_PROCESS_ID); 227 return (jint) pid; 228 } 229 230 JNIEXPORT jint JNICALL 231 Java_sun_management_VMManagementImpl_getAvailableProcessors 232 (JNIEnv *env, jobject dummy) 233 { 234 return JVM_ActiveProcessorCount(); 235 } 236 237 JNIEXPORT jlong JNICALL 238 Java_sun_management_VMManagementImpl_getSafepointCount 239 (JNIEnv *env, jobject dummy) 240 { 241 return jmm_interface->GetLongAttribute(env, NULL, 242 JMM_SAFEPOINT_COUNT); 243 } 244 245 JNIEXPORT jlong JNICALL 246 Java_sun_management_VMManagementImpl_getTotalSafepointTime 247 (JNIEnv *env, jobject dummy) 248 { 249 return jmm_interface->GetLongAttribute(env, NULL, 250 JMM_TOTAL_STOPPED_TIME_MS); 251 } 252 253 JNIEXPORT jlong JNICALL 254 Java_sun_management_VMManagementImpl_getSafepointSyncTime 255 (JNIEnv *env, jobject dummy) 256 { 257 return jmm_interface->GetLongAttribute(env, NULL, 258 JMM_TOTAL_SAFEPOINTSYNC_TIME_MS); 259 } 260 261 JNIEXPORT jlong JNICALL 262 Java_sun_management_VMManagementImpl_getTotalApplicationNonStoppedTime 263 (JNIEnv *env, jobject dummy) 264 { 265 return jmm_interface->GetLongAttribute(env, NULL, 266 JMM_TOTAL_APP_TIME_MS); 267 } 268 269 JNIEXPORT jlong JNICALL 270 Java_sun_management_VMManagementImpl_getLoadedClassSize 271 (JNIEnv *env, jobject dummy) 272 { 273 return jmm_interface->GetLongAttribute(env, NULL, 274 JMM_CLASS_LOADED_BYTES); 275 } 276 277 JNIEXPORT jlong JNICALL 278 Java_sun_management_VMManagementImpl_getUnloadedClassSize 279 (JNIEnv *env, jobject dummy) 280 { 281 return jmm_interface->GetLongAttribute(env, NULL, 282 JMM_CLASS_UNLOADED_BYTES); 283 } 284 JNIEXPORT jlong JNICALL 285 Java_sun_management_VMManagementImpl_getClassLoadingTime 286 (JNIEnv *env, jobject dummy) 287 { 288 return jmm_interface->GetLongAttribute(env, NULL, 289 JMM_TOTAL_CLASSLOAD_TIME_MS); 290 } 291 292 293 JNIEXPORT jlong JNICALL 294 Java_sun_management_VMManagementImpl_getMethodDataSize 295 (JNIEnv *env, jobject dummy) 296 { 297 return jmm_interface->GetLongAttribute(env, NULL, 298 JMM_METHOD_DATA_SIZE_BYTES); 299 } 300 301 JNIEXPORT jlong JNICALL 302 Java_sun_management_VMManagementImpl_getInitializedClassCount 303 (JNIEnv *env, jobject dummy) 304 { 305 return jmm_interface->GetLongAttribute(env, NULL, 306 JMM_CLASS_INIT_TOTAL_COUNT); 307 } 308 309 JNIEXPORT jlong JNICALL 310 Java_sun_management_VMManagementImpl_getClassInitializationTime 311 (JNIEnv *env, jobject dummy) 312 { 313 return jmm_interface->GetLongAttribute(env, NULL, 314 JMM_CLASS_INIT_TOTAL_TIME_MS); 315 } 316 317 JNIEXPORT jlong JNICALL 318 Java_sun_management_VMManagementImpl_getClassVerificationTime 319 (JNIEnv *env, jobject dummy) 320 { 321 return jmm_interface->GetLongAttribute(env, NULL, 322 JMM_CLASS_VERIFY_TOTAL_TIME_MS); 323 }