Определение минимальной потребности в памяти и использования ЦП
Я работал над одним программным проектом Java, который будет развернут на различных аппаратных устройствах (например, малиновый pi, Android-телефон).
Прежде чем выпустить этот проект в качестве продукта, я хотел бы направлять пользователей, четко указывая минимальные требования (с точки зрения памяти и процессора) или аппаратное устройство, которое пользователь должен иметь для запуска нашего программного продукта.
Как я могу их измерить? Какие инструменты доступны для Java?
Ответы
Ответ 1
Вы можете воспользоваться jvisualvm
путь к этому инструменту Программные файлы \Java\jdk1.6.0_38\bin\jvisualvm.exe
Вы можете использовать его для определения использования процессора и потребления памяти.
![enter image description here]()
Как вы можете видеть использование процессора и использование памяти. Надеюсь, этот инструмент поможет вам.
Ответ 2
Вы можете получить общую память, выделенную в JVM, с помощью:
Runtime.getRuntime().totalMemory();
и свободной памяти (неиспользуемая память, выделенная для JVM):
Runtime.getRuntime().freeMemory();
Итак, чтобы использовать память, вы можете вычесть свободную память
из общей памяти.
Итак, вы можете сделать что-то вроде этого:
long Total_Memory =Runtime.getRuntime().totalMemory();
long Free_Memory=Runtime.getRuntime().freeMemory();
long Memory =Total_Memory-Free_Memory;
Ответ 3
Некоторые из моих бесплатных тестовых тестов написаны на Java, с вариантами, которые работают на Raspberry Pi и Android. Читайте больше на моем сайте для получения результатов как для ссылок, так и для ссылок и ссылок на исходный код (бесплатно):
http://www.roylongbottom.org.uk/Raspberry%20Pi%20Benchmarks.htm#anchor13
http://www.roylongbottom.org.uk/android%20benchmarks.htm
Возможно, важнее, чем скорость процессора и размер памяти - это версии Android и Java. В моем случае более старые версии JRE не запускали код, созданный более поздним JDK, и я читал о тех же самых трудностях с Android.
Ответ 4
Довольно сложно заранее оценить использование памяти, и поэтому я предлагаю сделать некоторый мониторинг (под реальной нагрузкой), чтобы получить номера шаров.
Что касается памяти - типичный график использования кучи похож на тот, который указан в на этот вопрос, и похож на пилу. При нормальных условиях верхняя точка пилы - это место, где происходит GC. Вы можете снизить этот предел и чаще обращаться к GC, что приведет к более длительным задержкам/худшей производительности - так что это зависит от вас, если эти задержки приемлемы. Из изображения на связанном вопросе я бы сказал, что минимальный размер кучи должен быть 300M плюс стек, который чаще всего незначителен и не колеблется так сильно, если вы не делаете много Свертка струн и т.д.
Что касается процессора - опять же, это должно быть первым, из того, что вы находите приемлемым, в режиме реального времени и некоторой последующей обработкой, являющейся двумя противоположными углами. Java на самом деле не добавляет каких-либо специфических особенностей. Например, у Oracle есть краткое руководство по оценке для сервера Weblogic, но это может не иметь отношения к вашему делу. Там также аналогичная дискуссия на сайте сестры SO. Лучше всего провести какое-то тестирование и определить, что становится неприемлемым.
Ответ 5
Вы можете использовать инструменты профилирования, такие как JProfiler, JProbe и т.д., чтобы профилировать использование процессора и памяти вашего приложения под нагрузкой.
Когда у вас есть результаты использования процессора и памяти для долгого теста, скажем, тест за несколько дней, вы можете быть уверены в минимальных и максимальных требованиях к вашему java-приложению.
Ответ 6
Как насчет следующего кода (Также см. ответ здесь)
package client;
import java.io.File;
import java.text.NumberFormat;
public class SystemInfoUtil
{
private Runtime runtime = Runtime.getRuntime();
public String findInfo()
{
StringBuilder sb = new StringBuilder();
sb.append(this.getOsInfo());
sb.append(this.getMemInfo());
sb.append(this.getDiskInfo());
return sb.toString();
}
public String getOSname()
{
return System.getProperty("os.name");
}
public String getOSversion()
{
return System.getProperty("os.version");
}
public String getOsArch()
{
return System.getProperty("os.arch");
}
public long getTotalMem()
{
return Runtime.getRuntime().totalMemory();
}
public long getUsedMem()
{
return Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
}
public String getMemInfo()
{
NumberFormat format = NumberFormat.getInstance();
StringBuilder sb = new StringBuilder();
long maxMemory = runtime.maxMemory();
long allocatedMemory = runtime.totalMemory();
long freeMemory = runtime.freeMemory();
sb.append("Free memory: ");
sb.append(format.format(freeMemory / 1024));
sb.append("<br/>");
sb.append("Allocated memory: ");
sb.append(format.format(allocatedMemory / 1024));
sb.append("<br/>");
sb.append("Max memory: ");
sb.append(format.format(maxMemory / 1024));
sb.append("<br/>");
sb.append("Total free memory: ");
sb.append(format.format((freeMemory + (maxMemory - allocatedMemory)) / 1024));
sb.append("<br/>");
return sb.toString();
}
public String getOsInfo()
{
StringBuilder sb = new StringBuilder();
sb.append("OS: ");
sb.append(this.getOSname());
sb.append("<br/>");
sb.append("Version: ");
sb.append(this.getOSversion());
sb.append("<br/>");
sb.append(": ");
sb.append(this.getOsArch());
sb.append("<br/>");
sb.append("Available processors (cores): ");
sb.append(runtime.availableProcessors());
sb.append("<br/>");
return sb.toString();
}
public String getDiskInfo()
{
/* Get a list of all filesystem roots on this system */
File[] roots = File.listRoots();
StringBuilder sb = new StringBuilder();
/* For each filesystem root, print some info */
for (File root: roots)
{
sb.append("File system root: ");
sb.append(root.getAbsolutePath());
sb.append("<br/>");
sb.append("Total space (bytes): ");
sb.append(root.getTotalSpace());
sb.append("<br/>");
sb.append("Free space (bytes): ");
sb.append(root.getFreeSpace());
sb.append("<br/>");
sb.append("Usable space (bytes): ");
sb.append(root.getUsableSpace());
sb.append("<br/>");
}
return sb.toString();
}
}
Ответ 7
Существуют некоторые возможности для мониторинга и анализа приложений Java, как указано ниже.
- Jconsole
- JVisualVM
- Плагин NewRelic
- Профайлер Yourkit
Однако для нагрузочного тестирования вы можете использовать приложение, например Jmeter, для тестирования приложения в случаях использования, а также выполнять стресс-тестирование для определения эталона сборки приложения.
Не пропустите анализ ваших интерфейсных и серверных серверов также для сквозного анализа.