[Eclipse] [HOWTO] Solve java.lang.OutOfMemoryError: PermGen space

Recently (since I have been using Eclipse for PHP developers) I am getting an error while executing Eclipse Helios and I try to commit a ‘non-simple’ task (for the IDE), like saving a project, cutting multiple code lines, auto-complete function, and so on:

  1. Foreword. OS and configuration
  2. Problem description
  3. Solution
1. Foreword: OS and configuration
  • Windows 7 Professional 64bits.
  • Eclipse Helios for PHP developers x64.
  • Oracle JDK 7u4.

2. Problem description: you might see below Eclipse’s output when the JVM crashes:

!SESSION 2012-04-28 18:15:40.832 -----------------------------------------------
eclipse.buildId=I20100608-0911
java.version=1.7.0_04
java.vendor=Oracle Corporation
BootLoader constants: OS=win32, ARCH=x86_64, WS=win32, NL=es_ES
Framework arguments: -product org.eclipse.epp.package.php.product
Command-line arguments: -os win32 -ws win32 -arch x86_64 -product org.eclipse.epp.package.php.product
!ENTRY org.eclipse.core.resources 2 10035 2012-04-28 18:16:06.184
!MESSAGE The workspace exited with unsaved changes in the previous session; refreshing workspace to recover changes.


!SESSION Tue May 01 13:36:02 CEST 2012 -----------------------------------------
!ENTRY org.eclipse.equinox.launcher 4 0 2012-05-01 13:36:02.532
!MESSAGE Exception launching the Eclipse Platform:
!STACK
java.lang.OutOfMemoryError: PermGen space

While on the first paragraph it is shown the information about the Eclipse launching (OS, Eclipse version, Java version…) on the second paragraph it is shown the error information:

java.lang.OutOfMemoryError: PermGen space

Which means, as stated here (which redirects to here):

PermGen is the permanent generation of objects in the VM (Class names, internalized strings, objects that will never get garbage-collected)

3. Solution.

Looking up through the Internet about this error, I found (again on the Eclipse wiki) that it is necessary to increase the amount of memory that the JVM is authorized to use. It can be achieved by changing the launching configuration file (eclipse.ini), enhancing the XXMaxPermSize and Xmx parameters (by default to 256m and 384m respectively) as shown below:

– Complete eclipse.ini content:


-startup
plugins/org.eclipse.equinox.launcher_1.1.0.v20100507.jar
--launcher.library
plugins/org.eclipse.equinox.launcher.win32.win32.x86_64_1.1.0.v20100503
-product
org.eclipse.epp.package.php.product
--launcher.defaultAction
openFile
--launcher.XXMaxPermSize
512M
-showsplash
org.eclipse.platform
--launcher.XXMaxPermSize
512m
--launcher.defaultAction
openFile
-vm
C:\Program Files\Java\jdk1.7.0_04\bin
-vmargs
-XX:MaxPermSize=512m
-Dosgi.requiredJavaVersion=1.5
-Xms40m
-Xmx1024m

Edit: It is important to add the “-XX:MaxPermSize=256m” line after “-vmargs” (in my case, I decided to put “-XX:MaxPermSize=512m”.

[Java] [Singleton Pattern] Why using Public classes with Private constructors?

We can find an example of a Public class with Private constructor below:

public class Products {

private static List<Product> listProducts = new ArrayList<Product>();
static {
for (int i = 0; i<19; i++) {
listProducts.add(new Producto(i, “producto ” + i));
}
}

private Products() {}

}

If we try to cast an instance of the class above we will obtain the following error:

GestionProductos example = new GestionProductos();

Error: The constructor GestionProductos() is not visible

So, how can we use this kind of class, and more important, why? well, the answer is simple. The designer has done the class in this way because he/she doesn’t want the class to be instanced. Although most of the times this behavior is a whimsy decission, it is a good practice for (like the class from the example above) a component delivered to a third, which is going to be forced to use only one instance from the class, avoiding unnecesary and memory spending copies from that class. For example, the class above is going to simulate the persistence layer, and we only want one copy of this layer,and the properties from the class are only accessible by the public setters and getters from the same class, like the following example:

List <Producto> listadoProducts = Products.getProducts();

This coding practice is called Singleton Pattern, or unique instance (the designers ensures that the class is going to be instanced only once).

Another use of a Public class with one private constructor could be, for example, to be instanced using other overloaded constructors, and these constructors would call the private constructor.