Подтвердить что ты не робот

Определение минимальной потребности в памяти и использования ЦП

Я работал над одним программным проектом Java, который будет развернут на различных аппаратных устройствах (например, малиновый pi, Android-телефон).

Прежде чем выпустить этот проект в качестве продукта, я хотел бы направлять пользователей, четко указывая минимальные требования (с точки зрения памяти и процессора) или аппаратное устройство, которое пользователь должен иметь для запуска нашего программного продукта.

Как я могу их измерить? Какие инструменты доступны для Java?

4b9b3361

Ответ 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, для тестирования приложения в случаях использования, а также выполнять стресс-тестирование для определения эталона сборки приложения.

Не пропустите анализ ваших интерфейсных и серверных серверов также для сквозного анализа.