Announcement

Collapse
No announcement yet.

Speicher in Betriebsystem läuft davon(Linux), obwohl Heap nicht steigt!

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Speicher in Betriebsystem läuft davon(Linux), obwohl Heap nicht steigt!

    Hallo!

    Ich habe ein java Programm welches sehr rechen intensiv ist und somit viel CPU benötigt, der Heap bleibt über die Zeit hin konstant aber der Speicher im OS steigt und steigt(je mehr CPU Auslastung desto schneller steigt der Speicher).

    Ich habe nun Native Memory Tracking aktiviert und sehe das der "Internal" bereich um ca 400MB gestiegen ist. Die doku(siehe link unten) bringt mich leider nicht wirklich weiter. Habt Ihr ähnliche erfahrungen (hohe Auslastung --> hohe Speicherauslastung im OS)? Bzw. wie kann ich das verhindern?

    Ich habe nun ein kleines Testprogramm geschrieben, das ungefähr die Rechenleistung simuliert, mit einfacher Endlosschleife wo zyklisch Daten allokiert bzw freigegeben werden. Damit wollte ich ausschließen das ein Zusammenhang mit den verwendeten Bibliotheken besteht.
    This guide helps you to troubleshoot issues that might occur with Java Client applications created on the Java Platform, Standard Edition (Java SE) and Java HotSpot VM.

  • #2
    In Java kannst du keinen Specher freigeben.
    400 MB sehe ich nicht als viel an.

    Du kannst Klassen vorausschauend inititialisieren (Listen u.a.)

    Was soll man sagen, wenn man keine Infos hat?
    Was sollen die Links? Insbesondere der aufs Helpcenter?
    Worin besteht nun deine Frage?
    Christian

    Comment


    • #3
      Hallo!
      Ja natürlich, ich meinte ich hab die Referenz gelöscht damit der GC sie freigeben kann. Ja bei 400Mb bleibt es leider nicht der steigt noch weiter, bis das OS keinen Speicher mehr zur Verfügung stellen kann. Ich hab nun im Native Memory Tracking gesehen das der "Internal" bereich steigt, allerdings weiß ich nicht woran das liegt!
      Welche links? ich hab nur einen Link auf die Oracle-Docs gemacht.

      Comment


      • #4
        Welche links? ich hab nur einen Link auf die Oracle-Docs gemacht.
        Ich sehe in deinem Beitrg 2 Links.

        allerdings weiß ich nicht woran das liegt!
        Tja, und was sollen wir hier sagen? Raten? Glaskugel befragen?
        Christian

        Comment


        • #5
          Was ich weiß ist das bei der "Native Memory Tracking"-Auswertung der "Internal" bereich stark steigt allerdings bringen mich die Infos aus der Doku nicht weiter:


          Internal Memory that does not fit the previous categories, such as the memory used by the command line parser, JVMTI, properties and so on.

          Ich sehe auch einen Zusammenhang der CPU Auslastung und der Speicherauslatung im Betriebsystem. Also je mehr CPU Auslastung desto schneller steigt der Speicher

          Comment


          • #6
            Originally posted by bf89 View Post
            Ich sehe auch einen Zusammenhang der CPU Auslastung und der Speicherauslatung im Betriebsystem. Also je mehr CPU Auslastung desto schneller steigt der Speicher
            Das ist nicht Dein Ernst?!
            Speicher lastet sich nicht selbst aus, das macht die CPU. Wenn die also viel arbeitet, kann sie viel Speicher anfordern.
            Das ist vollkommen normal.

            Irgendwo hast Du evtl ein Memory Leak reingebastelt oder Deine Bibliotheken bringen eins mit.
            Vielleicht machst Du auch einfach nur eine gigantische Matrizenrechnung und der Speicher wird halt gebraucht.

            Comment


            • #7
              Ja, aber kann man erst beurteilen, wenn man Code hat. Der wird ja nicht geliefert.
              Christian

              Comment


              • #8
                Ich starte das Programm folgendermaßen
                Code:
                java -Xmx1G -XX:+UseG1GC -XX:G1PeriodicGCInterval=10000 -XX:G1HeapWastePercent=10 -jar test.jar
                Code:
                public static void main(String[] args) {
                    Random rand= new Random();
                        for(int i = 0; i< 3;i++) {
                            new Thread(new Runnable() {
                                @Override
                                public void run() {
                                    List<byte[]> threaddata = new ArrayList<>();
                                    while(true) {                              
                                        byte[] arr = new byte[Integer.valueOf(10000000)];
                                        rand.nextBytes(arr);
                                        threaddata.add(arr);
                                        Thread.sleep(100);
                                        threaddata.clear();
                                        Thread.sleep(100);  
                                    }
                                }                  
                            }).start();
                        }
                    }
                }
                Ich sehe dann das der Heapspace konstant bleibt, aber der Speicher im OS immer weiter steigt.
                Ich hab das Programm mal ein wenig adaptiert um die Endlosschleife Pausieren zu können, wenn ich das mache beruhigt sich der Speicher wieder...
                Zuletzt editiert von bf89; 28.05.2019, 06:57.

                Comment


                • #9
                  Originally posted by defo2 View Post
                  Das ist nicht Dein Ernst?!
                  Speicher lastet sich nicht selbst aus, das macht die CPU. Wenn die also viel arbeitet, kann sie viel Speicher anfordern.
                  Das ist vollkommen normal.

                  Irgendwo hast Du evtl ein Memory Leak reingebastelt oder Deine Bibliotheken bringen eins mit.
                  Vielleicht machst Du auch einfach nur eine gigantische Matrizenrechnung und der Speicher wird halt gebraucht.
                  Ja aber nach meiner bisherigen Erfahrung steigt der Speicher nicht unendlich(bis OS kein speicher mehr zur Verfügung stellen kann). Ich habe ein kleines Programm geschrieben(siehe Antwort darüber) welches die Auslastung simuliert, um auszuschließen das irgendwelche Bibliotheken etc. dies verursachen.
                  Meine reale Anwendung kommuniziert mit der SPS und bekommt Daten im ~100ms Takt, daher die hohe CPU Auslastung

                  Comment


                  • #10
                    Ich hatte es schom in #2 geschrieben:

                    Du kannst Klassen vorausschauend inititialisieren (Listen u.a.)
                    Zu dem Programm:

                    for(int i = 0; i< 3);i++) -> wohl falsch ist so nicht ablauffähig
                    Thread.sleep(100) -> Exception muss behandelt werden
                    } ->Letzte Zeile ist zuviel

                    Das Ding läuft jetzt hier ca. 15 Minuten und der Arbeitsspeicher änder sicht nicht viel. pendelt um diese Werte
                    Image101.jpg
                    Attached Files
                    Christian

                    Comment

                    Working...
                    X