/* * Copyright (C) 2006-2016 DLR, Germany * * All rights reserved * * http://www.rcenvironment.de/ */ package de.rcenvironment.core.start.validators.internal; import java.lang.management.ManagementFactory; import java.lang.management.MemoryPoolMXBean; import java.lang.management.RuntimeMXBean; import java.util.List; import de.rcenvironment.core.start.common.validation.api.InstanceValidationResult; import de.rcenvironment.core.start.common.validation.api.InstanceValidationResultFactory; import de.rcenvironment.core.start.common.validation.spi.DefaultInstanceValidator; /** * Ensures that RCE is started with a PermGen size >= 256 MB. * * @author Sascha Zur */ // TODO review: is this validator robust enough? especially the unit handling seems to be broken public class MaximumPermGenSizeValidator extends DefaultInstanceValidator { private static final String VALIDATION_DISPLAY_NAME = "Maximum permanent generation heap (MaxPermSize)"; private static final int DEFAULT_MIN_PERM_SIZE = 256; private static final String DEFAULT_MIN_PERM_SIZE_UNIT = "m"; @Override public InstanceValidationResult validate() { RuntimeMXBean runtimemxBean = ManagementFactory.getRuntimeMXBean(); List<String> arguments = runtimemxBean.getInputArguments(); String maxPermSizeDefined = null; for (String str : arguments) { if (str.startsWith("-XX:MaxPermSize")) { maxPermSizeDefined = str.substring(str.lastIndexOf('=') + 1); } } if (maxPermSizeDefined != null) { int maxPermSizeValue = Integer.parseInt(maxPermSizeDefined.substring(0, maxPermSizeDefined.length() - 1)); String maxPermSizeUnit = String.valueOf(maxPermSizeDefined.charAt(maxPermSizeDefined.length() - 1)); if (maxPermSizeUnit.toUpperCase().equals(DEFAULT_MIN_PERM_SIZE_UNIT.toUpperCase())) { if (maxPermSizeValue < DEFAULT_MIN_PERM_SIZE) { return createInstanceValidationResult(DEFAULT_MIN_PERM_SIZE, DEFAULT_MIN_PERM_SIZE_UNIT); } } } long maxPermgen = 0; for (MemoryPoolMXBean mx : ManagementFactory.getMemoryPoolMXBeans()) { if (mx.getName().endsWith("Perm Gen")) { maxPermgen = mx.getUsage().getMax() / (long) Math.pow(2, 2 * 10); } } if (maxPermgen != 0 && maxPermgen < DEFAULT_MIN_PERM_SIZE) { return createInstanceValidationResult(DEFAULT_MIN_PERM_SIZE, DEFAULT_MIN_PERM_SIZE_UNIT); } return InstanceValidationResultFactory.createResultForPassed(VALIDATION_DISPLAY_NAME); } private InstanceValidationResult createInstanceValidationResult(int minPermSizeValue, String minPermSizeUnit) { String errorMessage = Messages.permGenSizeTooLow + minPermSizeValue + minPermSizeUnit + "."; return InstanceValidationResultFactory.createResultForFailureWhichAllowesToProceed( VALIDATION_DISPLAY_NAME, errorMessage); } }