Случайно я наткнулся на другой способ сделать силовое убийство в Unix (для тех, кто использует Weblogic). Это дешевле и элегантнее, чем запуск / bin / kill -9 через Runtime.exec ().
import weblogic.nodemanager.util.Platform;
import weblogic.nodemanager.util.ProcessControl;
...
ProcessControl pctl = Platform.getProcessControl();
pctl.killProcess(pid);
И если вы пытаетесь получить pid, вы можете использовать отражение на java.lang.UNIXProcess , например:
Process proc = Runtime.getRuntime().exec(cmdarray, envp);
if (proc instanceof UNIXProcess) {
Field f = proc.getClass().getDeclaredField("pid");
f.setAccessible(true);
int pid = f.get(proc);
}
Metaspace - это область памяти для хранения метаданных класса - внутренних структур JVM, созданных при анализе файлов .class
.
Метаданные класса включают в себя:
-XX:MaxMetaspaceSize
не ограничен по умолчанию.
Когда опция -XX:+UseCompressedClassPointers
включена (по умолчанию для куч < 32G), классы перемещаются из Metaspace в отдельную область, называемую Compressed Class Space . Это должно разрешить адресацию структур классов VM с помощью 32-битных значений вместо 64-битных.
Итак, Compressed Class Space содержит внутреннее представление классов Java, в то время как Metaspace содержит все остальные метаданные: методы, пулы констант, аннотации и т. Д.
Размер сжатого пространства классов ограничен -XX:CompressedClassSpaceSize
, который по умолчанию равен 1G. Максимально возможное значение -XX:CompressedClassSpaceSize
составляет 3G.
Неклассовое Metaspace и Compressed Class Space являются двумя непересекающимися областями. MaxMetaspaceSize
ограничивает фиксированный размер обеих областей:
committed(Non-class Metaspace) + committed(Compressed Class Space) <= MaxMetaspaceSize
Если значение MaxMetaspaceSize
меньше CompressedClassSpaceSize
, последнее автоматически уменьшается до
CompressedClassSpaceSize = MaxMetaspaceSize - 2*InitialBootClassLoaderMetaspaceSize