< prev index next >

src/hotspot/share/services/attachListener.cpp

Print this page
rev 59026 : jmap baseline

*** 240,288 **** dumper.dump(op->arg(0), out); } return JNI_OK; } // Implementation of "inspectheap" command // See also: ClassHistogramDCmd class // // Input arguments :- ! // arg0: "-live" or "-all" ! // arg1: Name of the dump file or NULL static jint heap_inspection(AttachOperation* op, outputStream* out) { bool live_objects_only = true; // default is true to retain the behavior before this change is made outputStream* os = out; // if path not specified or path is NULL, use out - fileStream* fs = NULL; const char* arg0 = op->arg(0); ! if (arg0 != NULL && (strlen(arg0) > 0)) { ! if (strcmp(arg0, "-all") != 0 && strcmp(arg0, "-live") != 0) { ! out->print_cr("Invalid argument to inspectheap operation: %s", arg0); ! return JNI_ERR; ! } ! live_objects_only = strcmp(arg0, "-live") == 0; ! } ! ! const char* path = op->arg(1); ! if (path != NULL) { ! if (path[0] == '\0') { ! out->print_cr("No dump file specified"); ! } else { ! // create file ! fs = new (ResourceObj::C_HEAP, mtInternal) fileStream(path); ! if (fs == NULL) { ! out->print_cr("Failed to allocate space for file: %s", path); return JNI_ERR; } ! os = fs; } } ! VM_GC_HeapInspection heapop(os, live_objects_only /* request full gc */); VMThread::execute(&heapop); ! if (os != NULL && os != out) { ! out->print_cr("Heap inspection file created: %s", path); ! delete fs; } return JNI_OK; } // Implementation of "setflag" command --- 240,343 ---- dumper.dump(op->arg(0), out); } return JNI_OK; } + // Valid Arguments: + // "-live" or "-all" + // "parallel=<N>" + // "<filepath>" + static jint process_heap_inspect_options(const char* argline, + outputStream* out, + HeapInspectArgs* args) { + char* save_ptr; + char* buf = NEW_C_HEAP_ARRAY(char, strlen(argline)+1, mtInternal); + snprintf(buf, strlen(argline)+1, "%s", argline); + if (buf == NULL) { + return JNI_ERR; + } + char* arg = strtok_r(buf, ",", &save_ptr); + while (arg != NULL) { + // "-live" or "-all" + if (strcmp(arg, "-live") == 0) { + args->_live_object_only = true; + } else if (strcmp(arg, "-all") == 0) { + args->_live_object_only = false; + } else if (strncmp(arg, "parallel=", 9) == 0) { + char* num_str = &arg[9]; + uintx num = 0; + if (!Arguments::parse_uintx(num_str, &num, 0)) { + out->print_cr("Invalid parallel thread number"); + return JNI_ERR; + } + args->_parallel_thread_num = num; + } else { + // must be file path + assert(args->_path == NULL, "Must be"); + char* path = args->_path = NEW_C_HEAP_ARRAY(char, strlen(arg)+1, mtInternal); + if (path == NULL) { + out->print_cr("Out of internal memory."); + return JNI_ERR; + } + snprintf(path, strlen(arg)+1, "%s", arg); + if (path[0] == '\0') { + out->print_cr("No dump file specified."); + } else { + fileStream* fs = new (ResourceObj::C_HEAP, mtInternal) fileStream(path); + if (fs == NULL) { + out->print_cr("Failed to allocate filestream for file: %s", path); + return JNI_ERR; + } + args->_fs = fs; + } + } + arg = strtok_r(NULL, ",", &save_ptr); + } + FREE_C_HEAP_ARRAY(char, buf); + return JNI_OK; + } + + // Parse command options + static jint parse_cmd_options(const char* cmd, const char* argline, + outputStream* out, void* args) { + assert(argline != NULL, "Must be"); + if (strncmp(cmd, "heap_inspection", 11) == 0) { + HeapInspectArgs* insp_opts = (HeapInspectArgs*)args; + return process_heap_inspect_options(argline, out, insp_opts); + } + // Command not match + return JNI_ERR; + } + // Implementation of "inspectheap" command // See also: ClassHistogramDCmd class // // Input arguments :- ! // all arguments in op->arg(0); static jint heap_inspection(AttachOperation* op, outputStream* out) { bool live_objects_only = true; // default is true to retain the behavior before this change is made outputStream* os = out; // if path not specified or path is NULL, use out const char* arg0 = op->arg(0); ! size_t parallel_thread_num = os::processor_count() * 3 / 8; // default is less than half of processors. ! HeapInspectArgs args; ! // Parse arguments ! if (arg0 != NULL) { ! if (JNI_ERR == parse_cmd_options("heap_inspection", arg0, out, (void*)(&args))) { return JNI_ERR; } ! live_objects_only = args._live_object_only; ! os = args._fs == NULL ? out : args._fs; ! parallel_thread_num = args._parallel_thread_num == 0 ? parallel_thread_num : args._parallel_thread_num; ! if (parallel_thread_num == 0) { ! parallel_thread_num = 1; } } ! VM_GC_HeapInspection heapop(os, live_objects_only /* request full gc */, parallel_thread_num); VMThread::execute(&heapop); ! if (args._path != NULL) { ! out->print_cr("Heap inspection file created: %s", args._path); } return JNI_OK; } // Implementation of "setflag" command
< prev index next >