Благодаря thetalkingwalnut с ответом пакетная команда (команды) Windows для чтения первой строки из текстового файла я предложил следующее решение:
@echo off
for /f "delims=" %%a in ('type sample.txt') do (
echo %%a
exit /b
)
Ознакомьтесь с HotSpotDiagnosticMBean
В следующем примере будет распечатано значение параметра, а также его значение DEFAULT или VM_CREATION:
import java.lang.management.ManagementFactory;
import javax.management.ObjectName;
import javax.management.openmbean.CompositeData;
import javax.management.openmbean.CompositeDataSupport;
public class HotSpotTest {
public static void main(String [] args) throws Exception {
printHotSpotOption("MaxHeapFreeRatio");
printHotSpotOption("SurvivorRatio");
printHotSpotOptions();
}
private static void printHotSpotOption(String option) throws Exception {
ObjectName name = new ObjectName("com.sun.management:type=HotSpotDiagnostic");
String operationName = "getVMOption";
Object [] params = new Object [] {option};
String [] signature = new String[] {String.class.getName()};
Object result = ManagementFactory.getPlatformMBeanServer().invoke(name, operationName, params, signature);
CompositeDataSupport data = (CompositeDataSupport) result;
System.out.println(option);
System.out.println("- Value: "+data.get("value"));
System.out.println("- Origin: "+data.get("origin"));
}
private static void printHotSpotOptions() throws Exception {
ObjectName name = new ObjectName("com.sun.management:type=HotSpotDiagnostic");
String attributeName = "DiagnosticOptions";
Object result = ManagementFactory.getPlatformMBeanServer().getAttribute(name, attributeName);
CompositeData [] array = (CompositeData[]) result;
for (CompositeData d : array) {
System.out.println(d.get("name"));
System.out.println("- Value: "+d.get("value"));
System.out.println("- Origin: "+d.get("origin"));
}
}
}
Для этого можно использовать JMX. Запустите JConsole, и он должен отображаться на вкладке Сводка ВМ . Он должен отображать все аргументы, которые были переданы JVM.
Чтобы сделать это программно, вы можете обратиться к другому ответу SO: Как получить аргументы vm изнутри приложения java?
Если вы ищете быстрый и простой инструмент, читаемый человеком, jconsole может быть вам здесь. В частности, я просматриваю вкладку «Сводка виртуальной машины» в моем текущем запущенном процессе FindBugs и вижу следующие детали:
Текущий размер кучи: 788 720 кбайт
Максимальный размер кучи: 932 096 кбайт
Выделенная память: 923 648 кбайт
Ожидает завершения: 0 объектов
Сборщик мусора: Name = 'PS MarkSweep', Collections = 324, Общее затраченное время = 12 минут
Сборщик мусора: Name = 'PS Scavenge', Collections = 1132, Total потраченное время = 1 минута
Очевидно, что jvisualvm предоставит вам соответствующие подробности, но, похоже, он не так сильно ориентирован на ваши конкретные потребности (например, быстро читаемые сведения о сборщике мусора).
В идеале, я хотел бы увидеть, какие значения различных параметров -XX, связанных с сборщиком мусора, используются автоматически, как они выбираются виртуальной машиной. Если бы у меня было это, я мог бы начать настройку.
Обычно не так-то просто вывести точную конфигурацию кучи только из предоставленных флагов командной строки.
Если вам нужно знать конфигурацию кучи, и вы находитесь в среде, отличной от Windows, вы можете использовать jmap -heap
, как описано в этой записи блога .
Вот пример предоставленной информации:
using parallel threads in the new generation. using thread-local object allocation. Concurrent Mark-Sweep GC Heap Configuration: MinHeapFreeRatio = 40 MaxHeapFreeRatio = 70 MaxHeapSize = 1073741824 (1024.0MB) NewSize = 268435456 (256.0MB) MaxNewSize = 268435456 (256.0MB) OldSize = 805306368 (768.0MB) NewRatio = 7 SurvivorRatio = 6 PermSize = 21757952 (20.75MB) MaxPermSize = 88080384 (84.0MB)