| 140 | } |
| 141 | |
| 142 | bool VM::init(JavaVM* vm, bool attach) { |
| 143 | if (_jvmti != NULL) return true; |
| 144 | |
| 145 | _vm = vm; |
| 146 | if (_vm->GetEnv((void**)&_jvmti, JVMTI_VERSION_1_0) != 0) { |
| 147 | return false; |
| 148 | } |
| 149 | |
| 150 | bool is_hotspot = false; |
| 151 | bool is_zero_vm = false; |
| 152 | char* prop; |
| 153 | if (_jvmti->GetSystemProperty("java.vm.name", &prop) == 0) { |
| 154 | is_hotspot = strstr(prop, "OpenJDK") != NULL || |
| 155 | strstr(prop, "HotSpot") != NULL || |
| 156 | strstr(prop, "GraalVM") != NULL || |
| 157 | strstr(prop, "Dynamic Code Evolution") != NULL; |
| 158 | is_zero_vm = strstr(prop, "Zero") != NULL; |
| 159 | _zing = !is_hotspot && strstr(prop, "Zing") != NULL; |
| 160 | _jvmti->Deallocate((unsigned char*)prop); |
| 161 | } |
| 162 | |
| 163 | if (is_hotspot && _jvmti->GetSystemProperty("java.vm.version", &prop) == 0) { |
| 164 | if (strncmp(prop, "25.", 3) == 0 && prop[3] > '0') { |
| 165 | _hotspot_version = 8; |
| 166 | } else if (strncmp(prop, "24.", 3) == 0 && prop[3] > '0') { |
| 167 | _hotspot_version = 7; |
| 168 | } else if (strncmp(prop, "20.", 3) == 0 && prop[3] > '0') { |
| 169 | _hotspot_version = 6; |
| 170 | } else if ((_hotspot_version = atoi(prop)) < 9) { |
| 171 | _hotspot_version = 9; |
| 172 | } |
| 173 | _jvmti->Deallocate((unsigned char*)prop); |
| 174 | } |
| 175 | |
| 176 | // JVM symbols are globally visible on macOS |
| 177 | void* libjvm = RTLD_DEFAULT; |
| 178 | if (OS::isLinux() && (libjvm = dlopen("libjvm.so", RTLD_LAZY)) == NULL) { |
| 179 | Log::warn("Failed to load libjvm.so: %s", dlerror()); |
| 180 | libjvm = RTLD_DEFAULT; |
| 181 | } |
| 182 | _asyncGetCallTrace = (AsyncGetCallTrace)dlsym(libjvm, "AsyncGetCallTrace"); |
| 183 | _totalMemory = (JVM_MemoryFunc)dlsym(libjvm, "JVM_TotalMemory"); |
| 184 | _freeMemory = (JVM_MemoryFunc)dlsym(libjvm, "JVM_FreeMemory"); |
| 185 | |
| 186 | Profiler* profiler = Profiler::instance(); |
| 187 | if (VMStructs::libjvm() == NULL) { |
| 188 | profiler->updateSymbols(false); |
| 189 | VMStructs::init(profiler->findLibraryByAddress((const void*)_asyncGetCallTrace)); |
| 190 | } |
| 191 | |
| 192 | _openj9 = !is_hotspot && J9Ext::initialize(_jvmti, profiler->resolveSymbol("j9thread_self")); |
| 193 | |
| 194 | CodeCache* lib = profiler->findJvmLibrary("libj9vm"); |
| 195 | if (lib == NULL) { |
| 196 | return false; |
| 197 | } |
| 198 | |
| 199 | if (isOpenJ9()) { |
nothing calls this directly
no test coverage detected