4 Replies Latest reply on Nov 21, 2006 3:06 PM by peterj

    VM and GC tuning for JBoss

    viniciuscarvalho

      Hello there tuning masters! I've read a very interesting post here and after spent a good time reading sun's GC Tuning, Ergonomics, OnJava and JBoss wiki regarding this topic.
      We have an application that (today starts only with -Xms1024m -Xmx2520m) and after collecting GC information I got a bit worried.
      We're loosing throughput cause there's no youngGen default size, I believe that increasing it would help a lot (please advice on this :) )
      But also, what is worrying me the most is that the major collection is taking too long to run (after application is running for a while (6-8 hours)).
      Another issue I found is that the memory size is increasing in certain situations for the tenured generation

      Sample of Oldgen taking too long:

      11866.646: [Full GC [PSYoungGen: 11216K->0K(753920K)] [PSOldGen: 1648071K->1535604K(1747648K)] 1659287K->1535604K(2501568K) [PSPermGen: 95147K->95147K(96384K)], 4.4093300 secs]
      11871.120: [GC [PSYoungGen: 3777K->1056K(753216K)] 1539382K->1536660K(2500864K), 0.0318290 secs]
      11871.152: [Full GC [PSYoungGen: 1056K->0K(753216K)] [PSOldGen: 1535604K->1431360K(1747648K)] 1536660K->1431360K(2500864K) [PSPermGen: 95177K->94436K(95360K)], 4.7277330 secs]
      


      Sample of OldGen increasing instead of shrinking
      9203.157: [Full GC [PSYoungGen: 61141K->0K(635008K)] [PSOldGen: 1397552K->1441375K(1747648K)] 1458693K->1441375K(2382656K) [PSPermGen: 92656K->92656K(92800K)], 3.5918050 secs]
      9266.891: [Full GC [PSYoungGen: 72411K->0K(707520K)] [PSOldGen: 1441375K->1443979K(1747648K)] 1513786K->1443979K(2455168K) [PSPermGen: 92692K->92692K(92800K)], 3.9132890 secs]
      


      Any advice on this would be really appreciated :)

      Best regards

        • 1. Re: VM and GC tuning for JBoss
          peterj

          In general, your young generation should be 1/4 to 1/3 the size of your heap. I usually also recommend setting the heap min and max to the same size.

          Considering the size of your heap, a 4 second garbage collection is very normal (I have see 20 seconds with heaps that size). Setting the young generation size should help because then fewer objects will get tenured, which will reduce the number of times a full collection gets run.

          • 2. Re: VM and GC tuning for JBoss
            viniciuscarvalho

            Thanks Peter! So you set Xmx=Xms? I've read at the java tuning that this reduces the flexibility of the GC, would this cause any problems?

            So something like this: Xms2520m Xmx2520m -XX:NewRatio=3


            Also, having a bigger eden (-XX:NewRatio=2) wouldn't reduce the number of minor collections?

            Would it be a good practice to turn off explicit GC (-XX:+DisableExplicitGC) for RMI purposes and also other libs that people insist in doing System.g()?

            Also should i set the client interval though -Dsun.rmi.dgc.client.gcInterval=3600000 ?

            Best regards

            • 3. Re: VM and GC tuning for JBoss

              Considering the size of you heap and GC times you may consider something like Azul Systems.

              • 4. Re: VM and GC tuning for JBoss
                peterj

                I have never encountered problems setting min and max heap to the same size. Of course, I typically run on systems dedicated to the app server. If you run a mixed environment (other apps besides the app server) and the load on the app server changes over the course of the day ( example: app server heavily used during day but mostly quiet at night , but at night you have batch jobs running) you might want to set the sizes to different values so that the JVM can release memory space to other apps that might need it.

                Setting the eden ratio to 2 is not a good idea. You will end up with only full collections because when the JVM runs out of eden space, it makes a worst-case assumption that all the objects in eden will end up in the tenured generation, and if there is not enough run on the tenured generation it will do a full collection. Simplified example: tenured gen is 400MB, young gen is 400MB. Tenured gen has one object of 32 bytes in size. Eden is full, 400MB is greater than 400MB - 32 bytes, so full GC happens.

                Yes, turn off explicit gc, and set the client interval (later already set in the jboss bat/shell scripts).