Cleanup (unifies VM options bean API)

This commit is contained in:
Roman Shevchenko
2017-01-05 19:18:40 +01:00
parent fb98caddce
commit 451c65e123
3 changed files with 67 additions and 87 deletions
@@ -137,13 +137,13 @@ public class OutOfMemoryDialog extends DialogWrapper {
private void save() {
try {
int heapSize = Integer.parseInt(myHeapSizeField.getText());
VMOptions.writeXmx(heapSize);
VMOptions.writeOption(MemoryKind.HEAP, heapSize);
}
catch (NumberFormatException ignored) { }
try {
int codeCacheSize = Integer.parseInt(myCodeCacheSizeField.getText());
VMOptions.writeCodeCache(codeCacheSize);
VMOptions.writeOption(MemoryKind.CODE_CACHE, codeCacheSize);
}
catch (NumberFormatException ignored) { }
}
@@ -22,6 +22,7 @@ import com.intellij.openapi.util.SystemInfo;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.util.SystemProperties;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.annotations.TestOnly;
@@ -42,7 +43,7 @@ public class VMOptions {
public final String optionName;
public final String option;
public final Pattern pattern;
private final Pattern pattern;
MemoryKind(String name, String separator) {
optionName = name;
@@ -51,42 +52,9 @@ public class VMOptions {
}
}
public static int readXmx() {
return readOption(MemoryKind.HEAP, true);
}
public static int readMaxPermGen() {
return readOption(MemoryKind.PERM_GEN, true);
}
public static int readCodeCache() {
return readOption(MemoryKind.CODE_CACHE, true);
}
public static void writeXmx(int value) {
writeOption(MemoryKind.HEAP, value);
}
public static void writeMaxPermGen(int value) {
writeOption(MemoryKind.PERM_GEN, value);
}
public static void writeCodeCache(int value) {
writeOption(MemoryKind.CODE_CACHE, value);
}
public static int readOption(MemoryKind kind, boolean effective) {
public static int readOption(@NotNull MemoryKind kind, boolean effective) {
List<String> arguments;
if (ourTestPath != null) {
try {
String content = FileUtil.loadFile(new File(ourTestPath));
arguments = Collections.singletonList(content);
}
catch (IOException e) {
throw new RuntimeException(e);
}
}
else if (effective) {
if (effective) {
arguments = ManagementFactory.getRuntimeMXBean().getInputArguments();
}
else {
@@ -129,7 +97,7 @@ public class VMOptions {
return 1;
}
private static void writeOption(MemoryKind option, int value) {
public static void writeOption(@NotNull MemoryKind option, int value) {
File file = getWriteFile();
if (file == null) {
LOG.warn("VM options file not configured");
@@ -231,4 +199,36 @@ public class VMOptions {
static void clearTestFile() {
ourTestPath = null;
}
//<editor-fold desc="Deprecated stuff.">
/** @deprecated use {@link #readOption(MemoryKind, boolean)} (to be removed in IDEA 2018) */
public static int readXmx() {
return readOption(MemoryKind.HEAP, true);
}
/** @deprecated use {@link #readOption(MemoryKind, boolean)} (to be removed in IDEA 2018) */
public static int readMaxPermGen() {
return readOption(MemoryKind.PERM_GEN, true);
}
/** @deprecated use {@link #readOption(MemoryKind, boolean)} (to be removed in IDEA 2018) */
public static int readCodeCache() {
return readOption(MemoryKind.CODE_CACHE, true);
}
/** @deprecated use {@link #writeOption(MemoryKind, int)} (to be removed in IDEA 2018) */
public static void writeXmx(int value) {
writeOption(MemoryKind.HEAP, value);
}
/** @deprecated use {@link #writeOption(MemoryKind, int)} (to be removed in IDEA 2018) */
public static void writeMaxPermGen(int value) {
writeOption(MemoryKind.PERM_GEN, value);
}
/** @deprecated use {@link #writeOption(MemoryKind, int)} (to be removed in IDEA 2018) */
public static void writeCodeCache(int value) {
writeOption(MemoryKind.CODE_CACHE, value);
}
//</editor-fold>
}
@@ -24,11 +24,9 @@ import org.junit.Test;
import java.io.File;
import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.Assert.*;
import static org.junit.Assert.assertEquals;
public class VMOptionsTest {
@Rule public TempDirectory myTempDir = new TempDirectory();
@@ -47,100 +45,82 @@ public class VMOptionsTest {
VMOptions.clearTestFile();
}
@Test
public void testRegExpr() {
Pattern p = VMOptions.MemoryKind.HEAP.pattern;
Matcher m = p.matcher("-option -Xmx128mb -option");
assertTrue(m.find());
assertEquals("128", m.group(1));
assertEquals("mb", m.group(2));
m = p.matcher("-option -Xmx -option");
assertTrue(m.find());
assertEquals("", m.group(1));
assertEquals("", m.group(2));
m = p.matcher("-option -Xxx -option");
assertFalse(m.find());
}
@Test
public void testReading() {
assertEquals(512, VMOptions.readXmx());
assertEquals(128, VMOptions.readMaxPermGen());
assertEquals(512, VMOptions.readOption(VMOptions.MemoryKind.HEAP, false));
assertEquals(128, VMOptions.readOption(VMOptions.MemoryKind.PERM_GEN, false));
}
@Test
public void testReadingEmpty() throws IOException {
FileUtil.writeToFile(myFile, "");
assertEquals(-1, VMOptions.readXmx());
assertEquals(-1, VMOptions.readMaxPermGen());
assertEquals(-1, VMOptions.readOption(VMOptions.MemoryKind.HEAP, false));
assertEquals(-1, VMOptions.readOption(VMOptions.MemoryKind.PERM_GEN, false));
}
@Test
public void testReadingKilos() throws IOException {
FileUtil.writeToFile(myFile, "-Xmx512000k -XX:MaxPermSize=128000K -XX:ReservedCodeCacheSize=256000K");
assertEquals(512000 / 1024, VMOptions.readXmx());
assertEquals(128000 / 1024, VMOptions.readMaxPermGen());
assertEquals(256000 / 1024, VMOptions.readCodeCache());
assertEquals(512000 / 1024, VMOptions.readOption(VMOptions.MemoryKind.HEAP, false));
assertEquals(128000 / 1024, VMOptions.readOption(VMOptions.MemoryKind.PERM_GEN, false));
assertEquals(256000 / 1024, VMOptions.readOption(VMOptions.MemoryKind.CODE_CACHE, false));
}
@Test
public void testReadingGigs() throws IOException {
FileUtil.writeToFile(myFile, "-Xmx512g\n-XX:MaxPermSize=128G");
assertEquals(512 * 1024, VMOptions.readXmx());
assertEquals(128 * 1024, VMOptions.readMaxPermGen());
assertEquals(512 * 1024, VMOptions.readOption(VMOptions.MemoryKind.HEAP, false));
assertEquals(128 * 1024, VMOptions.readOption(VMOptions.MemoryKind.PERM_GEN, false));
}
@Test
public void testReadingWithoutUnit() throws IOException {
FileUtil.writeToFile(myFile, "-Xmx512\n-XX:MaxPermSize=128");
assertEquals(512, VMOptions.readXmx());
assertEquals(128, VMOptions.readMaxPermGen());
assertEquals(512, VMOptions.readOption(VMOptions.MemoryKind.HEAP, false));
assertEquals(128, VMOptions.readOption(VMOptions.MemoryKind.PERM_GEN, false));
}
@Test
public void testWriting() throws IOException {
VMOptions.writeXmx(1024);
VMOptions.writeMaxPermGen(512);
VMOptions.writeOption(VMOptions.MemoryKind.HEAP, 1024);
VMOptions.writeOption(VMOptions.MemoryKind.PERM_GEN, 512);
assertThat(FileUtil.loadFile(myFile)).isEqualToIgnoringWhitespace("-Xmx1024m\n-XX:MaxPermSize=512m");
assertThat(FileUtil.loadFile(myFile)).isEqualToIgnoringWhitespace("-Xmx1024m -XX:MaxPermSize=512m");
}
@Test
public void testWritingPreservingLocation() throws IOException {
FileUtil.writeToFile(myFile, "-someOption\n-Xmx512m\n-XX:MaxPermSize=128m\n-anotherOption");
VMOptions.writeXmx(1024);
VMOptions.writeMaxPermGen(256);
VMOptions.writeOption(VMOptions.MemoryKind.HEAP, 1024);
VMOptions.writeOption(VMOptions.MemoryKind.PERM_GEN, 256);
assertThat(FileUtil.loadFile(myFile)).isEqualToIgnoringWhitespace("-someOption\n-Xmx1024m\n-XX:MaxPermSize=256m\n-anotherOption");
assertThat(FileUtil.loadFile(myFile)).isEqualToIgnoringWhitespace("-someOption -Xmx1024m -XX:MaxPermSize=256m -anotherOption");
}
@Test
public void testWritingNew() throws IOException {
FileUtil.writeToFile(myFile, "-someOption");
VMOptions.writeXmx(1024);
VMOptions.writeMaxPermGen(256);
VMOptions.writeCodeCache(256);
VMOptions.writeOption(VMOptions.MemoryKind.HEAP, 1024);
VMOptions.writeOption(VMOptions.MemoryKind.PERM_GEN, 256);
VMOptions.writeOption(VMOptions.MemoryKind.CODE_CACHE, 256);
assertThat(FileUtil.loadFile(myFile)).isEqualToIgnoringWhitespace("-someOption\n-Xmx1024m\n-XX:MaxPermSize=256m\n-XX:ReservedCodeCacheSize=256m");
assertThat(FileUtil.loadFile(myFile)).isEqualToIgnoringWhitespace("-someOption -Xmx1024m -XX:MaxPermSize=256m -XX:ReservedCodeCacheSize=256m");
}
@Test
public void testWritingReadOnlyFile() throws IOException {
FileUtil.setReadOnlyAttribute(myFile.getPath(), true);
VMOptions.writeXmx(1024);
VMOptions.writeMaxPermGen(256);
VMOptions.writeOption(VMOptions.MemoryKind.HEAP, 1024);
VMOptions.writeOption(VMOptions.MemoryKind.PERM_GEN, 256);
assertThat(FileUtil.loadFile(myFile)).isEqualToIgnoringWhitespace("-Xmx1024m\n-XX:MaxPermSize=256m");
assertThat(FileUtil.loadFile(myFile)).isEqualToIgnoringWhitespace("-Xmx1024m -XX:MaxPermSize=256m");
}
@Test
@@ -149,9 +129,9 @@ public class VMOptionsTest {
FileUtil.delete(testFile);
VMOptions.setTestFile(testFile.getPath());
VMOptions.writeXmx(1024);
VMOptions.writeMaxPermGen(256);
VMOptions.writeOption(VMOptions.MemoryKind.HEAP, 1024);
VMOptions.writeOption(VMOptions.MemoryKind.PERM_GEN, 256);
assertThat(FileUtil.loadFile(testFile)).isEqualToIgnoringWhitespace("-Xmx1024m\n-XX:MaxPermSize=256m");
assertThat(FileUtil.loadFile(testFile)).isEqualToIgnoringWhitespace("-Xmx1024m -XX:MaxPermSize=256m");
}
}