blob: 4319229010cfbe3b0f49854d91e40e2af5519d39 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.ignite.internal.suggestions;
import java.util.ArrayList;
import java.util.List;
import org.apache.ignite.internal.util.typedef.internal.S;
import org.apache.ignite.internal.util.typedef.internal.U;
import org.jetbrains.annotations.NotNull;
/**
* Java Virtual Machine configuration suggestions.
*/
public class JvmConfigurationSuggestions {
/** */
private static final String XMX = "-Xmx";
/** */
private static final String MX = "-mx";
/** */
private static final String MAX_DIRECT_MEMORY_SIZE = "-XX:MaxDirectMemorySize";
/** */
private static final String DISABLE_EXPLICIT_GC = "-XX:+DisableExplicitGC";
/** */
private static final String NOT_USE_TLAB = "-XX:-UseTLAB";
/** */
private static final String SERVER = "-server";
/** */
private static final String USE_G1_GC = "-XX:+UseG1GC";
/**
* Checks JVM configurations and produces tuning suggestions.
*
* @return List of suggestions of Java Virtual Machine configuration tuning to increase Ignite performance.
*/
public static synchronized List<String> getSuggestions() {
List<String> suggestions = new ArrayList<>();
List<String> args = U.jvmArgs();
if (!U.jvmName().toLowerCase().contains("server"))
suggestions.add("Enable server mode for JVM (add '" + SERVER + "' to JVM options)");
if (!U.jdkVersion().equals("1.8"))
suggestions.add("Switch to the most recent 1.8 JVM version");
if (U.jdkVersion().equals("1.8") && !args.contains(USE_G1_GC))
suggestions.add("Enable G1 Garbage Collector (add '" + USE_G1_GC + "' to JVM options)");
if (!anyStartWith(args, XMX) && !anyStartWith(args, MX))
suggestions.add("Specify JVM heap max size (add '" + XMX + "<size>[g|G|m|M|k|K]' to JVM options)");
if (!anyStartWith(args, MAX_DIRECT_MEMORY_SIZE))
suggestions.add("Set max direct memory size if getting 'OOME: Direct buffer memory' " +
"(add '" + MAX_DIRECT_MEMORY_SIZE + "=<size>[g|G|m|M|k|K]' to JVM options)");
if (args.contains(NOT_USE_TLAB))
suggestions.add("Enable thread-local allocation buffer (add '-XX:+UseTLAB' to JVM options)");
if (!args.contains(DISABLE_EXPLICIT_GC))
suggestions.add("Disable processing of calls to System.gc() (add '" + DISABLE_EXPLICIT_GC + "' to JVM options)");
return suggestions;
}
/**
* @param lines Lines to check.
* @param prefix Prefix.
* @return {@code True} if found.
*/
private static boolean anyStartWith(@NotNull List<String> lines, @NotNull String prefix) {
for (String line : lines) {
if (line.startsWith(prefix))
return true;
}
return false;
}
/** {@inheritDoc} */
@Override public String toString() {
return S.toString(JvmConfigurationSuggestions.class, this);
}
}