03 August 2012

Use 64 bit data model JVM on Sun X Solaris

Goal: Either to determine the bit width in a Java program or use a 64 bit data model JVM.
OS: SunX Solaris 64 bit OS.
  1. First of all install 32 bit JDK/JRE (steps 1 and 2 are valid for JDK 1.6)
  2. Then add 64 bit packages over it. This will convert the JDK to work in both 32 bit and 64 bit modes (but 32 bit is still default).
  3. To test it for 32 bit, run $ java -version
  4. To test it for 64 bit, run $ java -d64 -version
  5. In ant binary file (in bin folder of apache-ant) add line ANT_OPTS="$ANT_OPTS -d64"
  6. If you do not want to change ant binary file, then you can set the environment variable every time you run the ant command. For e.g. setenv ANT_OPTS -d64
  7. Next you add instructions in build.xml file used by ant. In Java/JUnit tags, add property clonevm="true" if you have fork="true" property. This will clone the same VM environment for all forked processes, as for ant process itself. clonevm will not have any effect if fork is false.
  8. Run you ant target.
Following is the code example:
JVMBitSize.java
class JVMBitSize
{
  private static int jvmBit = 32;
  public static void main(String args[])
  {
    String sysProp = System.getProperty("sun.arch.data.model");
    System.out.println(sysProp);
    if(sysProp != null) {
      try {
        jvmBit = Integer.parseInt(sysProp.trim());
        System.out.println("JVMBit = " + jvmBit);
      } catch(NumberFormatException e) {
        System.out.println(e.getMessage());
      }
    }
  }
}

build.xml
<project name=" JVMBitSize " default="run" basedir=".">
  <path id="JVMBitSize.classpath">
    <path location="${basedir}"/>
  </path>
  <target name="compile">
    <javac srcdir="."/>
  </target>
  <target name="run" depends="compile">
    <echo level="info" message="JVM bit size in ant, before java task: ${sun.arch.data.model}"/>
    <java classname=" JVMBitSize" fork="true" clonevm="true">
      <classpath refid="JVMBitSize.classpath"/>
    </java>
  </target>
</project>

ant
#So that 64 bit data model of JVM is used and no java.lang.OutOfMemoryError exceptions are thrown
ANT_OPTS="$ANT_OPTS -Xms512m -Xmx1024m -XX:PermSize=256m -XX:MaxPermSize=512m -d64"

To run program: $ant run

2 comments:

Anonymous said...

thanks for sharing.

Connor Harley said...

I was pretty clueless at first but I asked my brother and boom! Thanks for this.