2015-05-21 31 views
12

Pracowałem nad jednym projektem oprogramowania Java, który zostanie wdrożony na różnych urządzeniach sprzętowych (np. Raspberry pi, telefon z systemem Android).Określanie minimalnego zapotrzebowania na pamięć i użycie procesora

Przed wydaniem tego projektu jako produktu, chciałbym poprowadzić użytkowników, wyraźnie określając minimalne wymagania (pod względem pamięci i procesora) lub urządzenie sprzętowe, jakie musi posiadać użytkownik, aby móc uruchomić nasze oprogramowanie.

Jak mogę je zmierzyć? Jakie narzędzia są dostępne dla Javy?

Odpowiedz

11

Możesz wziąć pomocy jvisualvm ścieżka tego narzędzia jest Program Files \ Java \ jdk1.6.0_38 \ bin \ jvisualvm.exe

Możesz go użyć do określenia wykorzystania procesora i zużycia pamięci.

enter image description here

Jak można zobaczyć obciążenie procesora oraz wykorzystanie pamięci. Mam nadzieję, że to narzędzie może ci pomóc.

5

Niektóre z moich darmowych testów porównawczych są napisane w języku Java, z odmianami działającymi na Raspberry Pi i Androidzie. Czytaj więcej na mojej stronie na wyniki zarówno plus odniesienia i linki do pobrania kod źródłowy (wolnych):

http://www.roylongbottom.org.uk/Raspberry%20Pi%20Benchmarks.htm#anchor13 http://www.roylongbottom.org.uk/android%20benchmarks.htm

Może ważniejsza niż szybkość procesora i wielkości pamięci są wersje Androida i Java. W moim przypadku starsze wersje JRE nie uruchamiałyby kodu wyprodukowanego przez późniejszy JDK i przeczytałem o tych samych trudnościach z Androidem.

+0

Zgadzam się, wymagania dotyczące pamięci i procesora będą się różnić między maszynami wirtualnymi. Program wykorzystujący małą ilość pamięci w maszynie wirtualnej Java Java może zużywać więcej na maszynie wirtualnej systemu Android ze względu na różnice w szczegółach implementacji. Benchmarking na wszystkich platformach i wersjach to jedyny sposób, aby móc wiarygodnie i dokładnie określić minimalne wymagania. – RudolphEst

+1

Chociaż może to teoretycznie odpowiedzieć na pytanie, [byłoby lepiej] (// meta.stackoverflow.com/q/8259), aby uwzględnić istotne części odpowiedzi tutaj, i podać link dla odniesienia. – SuperBiasedMan

9

Można dostać pamięć całkowita przydzielona do JVM z:

Runtime.getRuntime().totalMemory();

i wolnej pamięci (niewykorzystanej pamięci przydzielone do JVM) z:

Runtime.getRuntime().freeMemory();

So , aby uzyskać dostępną pamięć, można odjąć wolną pamięć od całkowitej pamięci.

Tak, można zrobić coś takiego:

long Total_Memory =Runtime.getRuntime().totalMemory(); long Free_Memory=Runtime.getRuntime().freeMemory(); long Memory =Total_Memory-Free_Memory;

+0

Czy te funkcje oznaczają przydzielanie sterty i stosu? – Pankesh

+0

Tak, wykonuje on alokację sterty, ale nie wiem, czy określa przydział stosu. Ponadto wielu programistów publikuje przybliżone wartości spełniające minimalne wymagania (takie jak 512 MB, 1 GB, 2 GB itp.). Więc nie musisz być z nim tak dokładny. Na przykład, powiedzmy, że używa 490 MB, możesz wtedy powiedzieć, że minimalne wymaganie to 512 MB – Paul

+0

Prawdopodobnie, aby było bardziej dokładne, musisz wziąć pod uwagę także aktywność gc. Na przykład Twój program zgromadziłby trochę śmieci, które prawdopodobnie jeszcze nie zostały wyczyszczone. Więc lepiej byłoby uruchomić GC forsownie przed sprawdzeniem dostępnej pamięci. –

4

Jest to raczej trudne do oszacowania zużycia pamięci z góry i dlatego proponuję zrobić kilka monitorowanie (pod rzeczywistym obciążeniem), aby uzyskać numery stadionów piłkarskich.

W odniesieniu do pamięci - typowy wykres użycia sterty jest podobny do wymienionego w this question i wygląda podobnie do piły. W normalnych okolicznościach szczytem piły jest miejsce, w którym odbywa się GC. Możesz obniżyć ten limit i częściej powoływać się na GC, powodując dłuższe opóźnienia/gorsze wyniki - więc od Ciebie zależy, czy te opóźnienia są do przyjęcia. Z obrazu na połączonym pytaniu powiedziałbym, że minimalny rozmiar sterty powinien wynosić 300M plus stos, który jest most often insignificant i nie podlega tak dużym fluktuacjom, chyba że robisz dużo ciągów, itp.

Co do procesora - znowu, powinno to być pierwsze z tego, co można zaakceptować w czasie rzeczywistym, a niektóre przetwarzanie końcowe to dwie przeciwległe narożne przypadki. Java naprawdę nie dodaje do tego żadnych szczegółów. Na przykład Oracle ma numer short estimation guide for Weblogic server, ale może to nie mieć znaczenia dla twojej sprawy. Jest również similar discussion na siostrzanej stronie SO. Najlepiej jest przeprowadzić pewne testy i określić punkt, w którym rzeczy stają się nie do przyjęcia.

4

Można użyć narzędzi do profilowania takich jak JProfiler, JProbe itp., Aby profilować wykorzystanie procesora i pamięci w aplikacji pod obciążeniem.

Po uzyskaniu wyników użycia procesora i pamięci przez długi czas testu, powiedz test kilka dni, możesz być pewny przy minimalnych i maksymalnych wymaganiach aplikacji java.

3

Jak o następujący kod (patrz także odpowiedzieć here)

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(); 
    } 
} 
0

Dostępnych jest kilka opcji monitorowania & analizowania aplikacji Java w sposób przedstawiony poniżej.

  1. JConsole
  2. JVisualVM
  3. NewRelic Plugin
  4. YourKit Profiler

jednak do testowania można użyć aplikacji jak JMeter do stosowania testów na przypadkach użycia, a także może wykonać testy warunków skrajnych na obciążenie określają punkt odniesienia dla budowania aplikacji.

Nie przegap analizy serwerów frontend i backendu, aby przeprowadzić kompleksową analizę.