Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to free up memory?

We have been facing Out of Memory errors in our App server for sometime. We see the used heap size increasing gradually until finally it reaches the available heap in size. This happens every 3 weeks after which a server restart is needed to fix this. Upon analysis of the heap dumps we find the problem to be objects used in JSPs.

Can JSP objects be the real cause of Appserver memory issues? How do we free up JSP objects (Objects which are being instantiated using usebean or other tags)?

We have a clustered Websphere appserver with 2 nodes and an IHS.

EDIT: The findings above are based on the heap-dump and nativestderr log analysis given below using the IBM support assistant

nativestd err log analysis:

alt text http://saregos.com/wp-content/uploads/2010/03/chart.jpg

Heap dump analysis:

![alt text][2]

Heap dump analysis showing the immediate dominators (2 levels up of hastable entry in the image above)

![alt text][3]

The last image shows that the immediate dominators are in fact objects being used in JSPs.

EDIT2: More info available at http://saregos.com/?p=43

like image 521
sarego Avatar asked Mar 24 '10 11:03

sarego


People also ask

Can you free up RAM space?

Your RAM is volatile, and restarting your computer helps to empty out memory and disk caches. It will also terminate programs running in the background, so things run smoother after restarting. Your RAM will not increase when you do a restart, but it could free up your RAM memory.

Why is my memory usage so high?

Close Unnecessary Programs and Applications However, the high memory usage problem is mainly due to the overcrowding of many internal processes. Therefore, it helps to stop the unnecessary programs and applications that are running. Open the Task Manager and check any extra programs you aren't using.


2 Answers

I'd first attach a profile tool to tell you what these "Objects" are that are taking up all the memory.

Eclipse has TPTP, or there is JProfiler or JProbe.

Any of these should show the object heap creaping up and allow you to inspect it to see what is on the heap.

Then search the code base to find who is creating these.

Maybe you have a cache or tree/map object with elements in and you have only implemented the "equals()" method on these objects, and you need to implement "hashcode()". This would then result in the map/cache/tree getting bigger and bigger till it falls over. This is only a guess though.

JProfiler would be my first call

Javaworld has example screen shot of what is in memory...

alt text
(source: javaworld.com)

And a screen shot of object heap building up and being cleaned up (hence the saw edge)

alt text
(source: javaworld.com)

UPDATE *************************************************

Ok, I'd look at...

http://www-01.ibm.com/support/docview.wss?uid=swg1PK38940

Heap usage increases over time which leads to an OutOfMemory condition. Analysis of a heapdump shows that the following objects are taking up an increasing amount of space:

40,543,128 [304] 47 class

com/ibm/wsspi/rasdiag/DiagnosticConfigHome 40,539,056 [56] 2 java/util/Hashtable 0xa8089170 40,539,000 [2,064] 511 array of java/util/Hashtable$Entry 6,300,888 [40] 3 java/util/Hashtable$HashtableCacheHashEntry

like image 123
jeff porter Avatar answered Oct 31 '22 02:10

jeff porter


Triggering the garbage collection manually doesn't solve your problem - it won't free resources that are still in use.

You should use a profiling tool (like jProfiler) to find your leaks. You problably use code that stores references in lists or maps that are not released during runtime - propably static references.

like image 44
Daniel Bleisteiner Avatar answered Oct 31 '22 01:10

Daniel Bleisteiner