Hope this code might helps you
Regards
Sudhakar
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.nio.channels.FileLock;
import java.util.Properties;
/**
* Class to have the current application relaunched with enough memory.
* <p>
* Usage:
*
* public static void main(String[] argv)
* {
* try
* {
* new needMemory().needMemory(400, argv); // 400Mb
limit, 200Mb initial.
* .......................
*
* @author J.F.Lanting
* @since 07-Oct-2002
*/
public final class NeedMemory
{
/**
* Environment variable to check for recursive re-launching
(->'needMemory()').
*/
private final static String launchToken = "RELAUNCHEDFORHEAP";
/**
* Checks if enough memory is available to the VM for this
application and optionally re-launches it.
* <p>
* If not, the application is re-launched from this copy with:<BR>
* - the same commandline and<BR>
* - the same JAVA release.<BR>
* The operation fails or is blocked because:<BR>
* 1) this is already a re-launch (something must be wrong),<BR>
* 2) the amount of memory asked for is > 1500Mb which is out of reach.<BR>
* The first situation is controlled by a property: 'launchToken'.<BR>
* We relaunch the application with initially 50% of the heap limit
allocated.
* </p>
*
* @param needed # of Mb to establish.
* @param commandLine the command line as appearing in 'main()'.
* @throws Exception for excess needs or recursive launches (a bug?).
*/
public void needMemory(int needed, String[] programCommandLine)
throws Exception
{
long available; // What we've got.
String javaPath; // The path to java or java.exe
URL u; // The URL to this class from
the classloader.
String programPath = null; // The path to this .jar or
.class if any.
File directory; // Directory of the .jar or .class file.
boolean isJarFile; // If this is run from a .jar file.
String[] commandVector; // The new commandline for re-launch.
String s;
int i;
if((available = toMegaBytes(Runtime.getRuntime().maxMemory())) < needed)
{
if(needed > 1500)
{
throw new Exception
("IMPOSSIBLE TO MEET REQUEST FOR " + needed + " Mb MEMORY.");
}
if(System.getProperty(launchToken) != null)
{
throw new Exception("FATAL RECURSION IN RE-LAUNCH");
}
// Where did I come from ?
u = getClass().getResource("needMemory.class");
if(u == null)
{
throw new Exception("CAN'T FIND MY OWN CLASS FILE.");
}
// Determine the path to a class-file or to a jar-file from the classloader URL:
s = u.getPath();
if(s.startsWith("file:/")) // It's a jar-file.
{
isJarFile = true;
if(File.separatorChar == '/') // UNIX|LINUX
{
s = s.substring(5); // Leaves a / alone.
}
else
{
s = s.substring(6); // Strips the / away.
}
if((i = s.indexOf("!/")) > 0)
{
s = s.substring(0, i); // Deletes the internal jar path.
}
commandVector = new String[6 + programCommandLine.length];
}
else // In a class file.
{
isJarFile = false;
if(s.startsWith("/"))
{
s = s.substring(1); // Waste the /.
}
if((i = s.indexOf(".class")) > 0)
{
s = s.substring(0, i); // Drop the extension.
}
commandVector = new String[5 + programCommandLine.length];
}
if(s.indexOf("%20") >= 0) // Incase the URL contained them.
{
s = s.replaceAll("%20", " ");
}
programPath = s;
// Where to find java[w] :
javaPath = System.getProperty("java.home");
if(File.separatorChar == '/') // UNIX|LINUX
{
javaPath += "/bin/java";
}
else
{
javaPath += "\\bin\\javaw.exe";
}
// Prepare new commandline :
commandVector[0] = javaPath;
needed = (int)(needed * 1.01 + 1); // Allow 1% more plus one.
commandVector[1] = "-Xms" + (needed / 2) + "m"; // Initial heap.
commandVector[2] = "-Xmx" + needed + "m"; // Maximum heap.
commandVector[3] = "-D" + "RELAUNCHEDFORHEAP" + "=1";
directory = new File(programPath);
if(isJarFile)
{
commandVector[4] = "-jar";
commandVector[5] = directory.getName();
i = 6;
}
else
{
commandVector[4] = directory.getName();
i = 5;
}
directory = directory.getParentFile();
for(int j = 0; j < programCommandLine.length; ++j, ++i)
{
commandVector[i] = programCommandLine[j];
}
// Log the action :
for(i = 0; i < commandVector.length; ++i)
{
if(i == 0)
{
s = commandVector[0];
}
else
{
s += " " + commandVector[i];
}
}
System.out.println
(
"+++ Re-launch, heap=" + available
+ "Mb, requested=" + needed
+ "Mb, from directory " + directory.getAbsolutePath()
+ ", commandline="
);
System.out.println(s);
// Re-launch :
i = launch(commandVector, directory);
if(i < 0)
{
System.out.println("*** RE-LAUNCH ATTEMPT FAILED.");
}
else
{
System.out.println("### End of re-launch.");
}
System.exit(i);
}
}
/**
* Executes an application and waits for completion.
* <p>
* For execution <u>without</u> waiting see also <b>Sy.execute()</b>,<BR>
* for execution with tethers (pipes) see also <b>Sy.tether()</b>.<BR>
* <u>NOTE:</u> a failing execution just returns <b>-1</b>.<p>
* A sample call is:<BR>
* <b>result = launch(new String[] { "df", "-k", fileName},
"OUTPUT" );</b></p>
*
* @param commandVector Command line as array.
* @param dir directory in which the process runs.
* @return Exit status from the command.
*/
public int launch(String[] commandVector, File dir)
{
Process p;
int exitValue = -1;
if((p = execute(commandVector, dir)) != null)
{
try
{
exitValue = p.waitFor();
}
catch(InterruptedException e)
{
exitValue = -1;
}
}
return(exitValue);
}
/**
* Executes an application in a directory, without waiting for it
and returns the Process object.
*
* @param commandVector command line as String array.
* @param dir directory in which the process runs.
* @return Process object for the child process.
*/
public static Process execute(String[] commandVector, File dir)
{
Process p;
try
{
p = Runtime.getRuntime().exec(commandVector, null, dir);
}
catch(IOException e)
{
p = null;
}
return(p);
}
/**
* Returns a number of bytes as Mb, rounded up.
*
* @param m # of bytes
* @return the # of Mb.
*/
public static long toMegaBytes(long m)
{
return((m / 1024 + 512) / 1024);
}
}
/*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*/
/*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*/
On Thu, 24 Feb 2005 09:58:28 -0500, [EMAIL PROTECTED]
<[EMAIL PROTECTED]> wrote:
>
> Can we set the memory programmaticaly?
> Thanks
> Rohit
>
> Chris Bowditch
> <[EMAIL PROTECTED] To: [EMAIL PROTECTED]
> otmail.com> cc:
> Subject: Re: Out of Memory
> problem
> 02/24/2005 04:25
> AM
> Please respond to
> fop-user
>
>
> Manisha Sathe wrote:
>
> > I am trying for one Chinese PDF. When i do not make use of Arial Unicode
> > MS font then i do not get this error. All chinese characters are
> > displayed as #. Once i use this font then i get this error (even if it
> > is just 2-3 pages long - sometimes at very beginning i get the 1 page
> > report - after that even not that)
> >
> > I tried the the things mentined such as reduce the size of image, page
> > sequence (do not know how to increase the JVM memory on fly) - also
> > reset the Cache etc what ever given in docs, but still same.
>
> To increase JVM memory, just change your FOP.bat or whatever script starts
> your Java VM and specify command line parameter -Xmx256M. The default is
> 64Mb,
> which isnt sufficient due to the large number of glyphs in The Arial
> Unicode font.
>
> <snip/>
>
> Chris
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
>
>
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]