2013-04-12 4 views
1

Я написал программу java, и я хочу видеть, когда она работает, сколько оперативной памяти она использует. Есть ли способ узнать, сколько оперативной памяти связано с моей программой? Я имею в виду что-то вроде использования времени программы, которую можно увидеть, написав этот код до и после вызова основного кода:Определите, сколько памяти использует мое приложение

long startTime = System.currentTimeMillis(); 
new Main(); 
long endTime = System.currentTimeMillis(); 
System.out.println("Total Time: " + (endTime - startTime)); 
+0

возможно дубликат [определения использования памяти Java] (http://stackoverflow.com/questions/390449/determining -java-memory-usage) –

+0

да, вы правы, спасибо за вашего гида. – 2013-04-12 21:06:19

ответ

1

Вы можете использовать следующий класс. Implemeting интерфейса cоздателя экземпляров можно выполнять несколько раз один и тот же процесс, чтобы получить точное представление о потреблении

public class SizeOfUtil { 

    private static final Runtime runtime = Runtime.getRuntime(); 
    private static final int OBJECT_COUNT = 100000; 

    /** 
    * Return the size of an object instantiated using the instantiator 
    * 
    * @param instantiator 
    * @return byte size of the instantiate object 
    */  
    static public int execute(Instantiator instantiator) { 
     runGarbageCollection(); 
     usedMemory(); 
     Object[] objects = new Object[OBJECT_COUNT + 1]; 
     long heapSize = 0; 
     for (int i = 0; i < OBJECT_COUNT + 1; ++i) { 
      Object object = instantiator.execute(); 
      if (i > 0) 
       objects[i] = object; 
      else { 
       object = null; 
       runGarbageCollection(); 
       heapSize = usedMemory(); 
      } 
     } 
     runGarbageCollection(); 
     long heap2 = usedMemory(); // Take an after heap snapshot: 
     final int size = Math.round(((float) (heap2 - heapSize))/OBJECT_COUNT); 

     for (int i = 1; i < OBJECT_COUNT + 1; ++i) 
      objects[i] = null; 
     objects = null; 
     return size; 
    } 

    private static void runGarbageCollection() { 
     for (int r = 0; r < 4; ++r){ 
      long usedMem1 = usedMemory(); 
      long usedMem2 = Long.MAX_VALUE; 
      for (int i = 0; (usedMem1 < usedMem2) && (i < 500); ++i) { 
       runtime.runFinalization(); 
       runtime.gc(); 
       Thread.yield(); 
       usedMem2 = usedMem1; 
       usedMem1 = usedMemory(); 
      } 
     } 
    } 

    private static long usedMemory() { 
     return runtime.totalMemory() - runtime.freeMemory(); 
    } 
} 

памяти Реализовать интерфейс

общедоступного интерфейс {Object cоздателя экземпляров Execute(); }

с кодом, который необходимо проверить

public void sizeOfInteger(){ 
    int size = SizeOfUtil.execute(new Instantiator(){ 
     @Override public Object execute() { 
      return new Integer (3); 
     } 
    }); 
    System.out.println(Integer.class.getSimpleName() + " size = " + size + " bytes"); 
} 

Источник: Java Tutorial Java Size of objects

+0

где должен быть написан мой собственный код? – 2013-04-12 20:58:02

+0

Я завершил свой ответ –

0

Я думаю, это должно помочь: visualvm

он поставляется с JDK, и есть много вещей, которые помогают контролировать использование памяти.

0

вы можете получить очень близкое значение, сравнив бесплатную память JVM до и после загрузки вашей программы. Разница очень близка к использованию вашей программы в памяти. Для того, чтобы получить свободный использование памяти JVM

Runtime.getRuntime().freeMemory() 

Чтобы получить использование памяти сделать это:

public static void main (String args[]){ 
    long initial = Runtime.getRuntime().freeMemory(); //this must be the first line of code executed 
    //run your program ... load gui etc 
    long memoryUsage = Runtime.getRuntime().freeMemory() - initial ; 

} 
+0

Мне нужна свободная память, в то время как программа работает не при завершении работы. это тоже работает? – 2013-04-12 11:42:24

+0

вы можете запускать эту команду в любое удобное для вас время, без ограничений – MaVRoSCy

+0

, когда программа заканчивается, она работает, поэтому она не показывает использование памяти в коде. – 2013-04-12 13:28:41

0

От java-application-memory-usage
Запуск вашего приложения с -Dcom.sun.management.jmxremote опции, например

java -Dcom.sun.management.jmxremote -jar myapp.jar 

Или вы можете попробовать:

jvisualvm.exe Вы можете найти его в директории JDK/бен.

Посмотрите на следующее может это помогает:

  1. how-can-i-monitor-how-many-threads-and-memory-usage-in-my-jvm-or-eclipse
  2. Memory usage of a Java process
Смежные вопросы