< prev index next >
src/hotspot/share/services/attachListener.cpp
Print this page
@@ -240,104 +240,56 @@
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);
+// arg0: "-live" or "-all"
+// arg1: Name of the dump file or NULL
+// arg2: parallel thread number
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);
- 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))) {
+ uint parallel_thread_num = MAX2<uint>(1, (uint)os::initial_active_processor_count() * 3 / 8);
+ 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 = 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;
+ live_objects_only = strcmp(arg0, "-live") == 0;
+ }
+
+ const char* path = op->arg(1);
+ if (path != NULL && path[0] != '\0') {
+ // create file
+ fs = new (ResourceObj::C_HEAP, mtInternal) fileStream(path);
+ if (fs == NULL) {
+ out->print_cr("Failed to allocate space for file: %s", path);
+ }
+ os = fs;
+ }
+
+ const char* num_str = op->arg(2);
+ if (num_str != NULL && num_str[0] != '\0') {
+ uintx num;
+ if (!Arguments::parse_uintx(num_str, &num, 0)) {
+ out->print_cr("Invalid parallel thread number: [%s]", num_str);
+ return JNI_ERR;
}
+ parallel_thread_num = num == 0 ? parallel_thread_num : (uint)num;
}
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);
+ if (os != NULL && os != out) {
+ out->print_cr("Heap inspection file created: %s", path);
+ delete fs;
}
return JNI_OK;
}
// Implementation of "setflag" command
< prev index next >