Reducing memory use in large Java application

Hello,
I've read through many of the threads on memory optimization in Java and am still puzzled about one thing:
I've got a large Java application that uses around 45,000 kb of memory (according to the Windows Task Manager) when it first starts up. If I reduce the program window and then restore it, the memory use comes down to about 25,000 kb, and stays down, even when the program is in regular use.
Two questions about this:
1) Why does reducing and restoring the program have this effect?
2) Is there any way I can duplicate this effect automatically, so that the program starts off using the smaller amount of memory?
And a final question: does anyone have any recommendations regarding the several commercial products that are available for optimizing memory use in Java apps?
Many thanks!
David Porter

this effect (minimize application window, rsize it again) is not a Java but a Windows problem. It also works for pure WIndows applications - try it out!
reducing memory size is not a question of 3rd party java apps or APIS but the JVM and the coding style of the application programmer.

Similar Messages

  • How to reduce memory use on my iMac

    How to reduce memory use on my iMac, OS X Yosemite, 2.7 GHz Intel Core i5
    8 GB memory
    Running very slowly, and the little spinning ball showing up.
    How do I clean up my IMac please?
    Should I use MacKeep or any clean up apps?

    When you see a beachball cursor or the slowness is especially bad, note the exact time: hour, minute, second.  
    These instructions must be carried out as an administrator. If you have only one user account, you are the administrator.
    Launch the Console application in any of the following ways:
    ☞ Enter the first few letters of its name into a Spotlight search. Select it in the results (it should be at the top.)
    ☞ In the Finder, select Go ▹ Utilities from the menu bar, or press the key combination shift-command-U. The application is in the folder that opens.
    ☞ Open LaunchPad and start typing the name.
    The title of the Console window should be All Messages. If it isn't, select
              SYSTEM LOG QUERIES ▹ All Messages
    from the log list on the left. If you don't see that list, select
              View ▹ Show Log List
    from the menu bar at the top of the screen.
    Each message in the log begins with the date and time when it was entered. Scroll back to the time you noted above.
    Select the messages entered from then until the end of the episode, or until they start to repeat, whichever comes first.
    Copy the messages to the Clipboard by pressing the key combination command-C. Paste into a reply to this message by pressing command-V.
    The log contains a vast amount of information, almost all of it useless for solving any particular problem. When posting a log extract, be selective. A few dozen lines are almost always more than enough.
    Please don't indiscriminately dump thousands of lines from the log into this discussion.
    Please don't post screenshots of log messages—post the text.
    Some private information, such as your name, may appear in the log. Anonymize before posting.

  • How can I measure memory allocation of a Java Application?

    We built a web application that enables images to be loaded into a database through a servlet running on Tomcat. We have inconsistent behaivor when more than x number of people are loading images simultaneously. No doubt a memory allocation problem, but how can I measure it?
    For example, I'd like to be able to create a graph showing the resources used against the number of people making uploads. I am using Linux and Tomcat/Apache.
    I am hoping for something like Memory counters that are available for measurine Windows applications on MS Windows - comes with the Resource Kit. Does this type of tool exist for the Java/Linux market?

    It is difficult to gauge memory usage from a Java application as the JVM handles garbage collection and even if objects are not referenced they might still be sitting in memory until the next garbage collect.
    Anyhow, a way to query available memory is:
    Runtime.getRuntime().freeMemory()
    You can run this at the begining of a process and at the end and examine the difference. You should call System.gc() before each freeMemory() call in order to try to force garbage collection.
    Another method would be to turn to the underlying OS. On linux you could use 'top' or 'ps'. With ps you could do something like:
    ps -o rss,vsz,%mem <pid>
    Where <pid> is the parent Tomcat process' id. The resulting three columns are:
    - Amount of real memory used.
    - Amount of virtual memory used.
    - Percentage of real memory used.
    'man ps' wil give you more options on how to use ps.
    There are also fancy graphical stuff like 'gtop' as well.
    Hope this helps.

  • Tutorial to use  JFreeChart in Java Application

    Dear Friends,
    Can anyone Please help me to provide a complete tutorial on using JFreeChart in Java Applicaion.That is, How can I use JFreeChart in Java Application.
    Thank u.

    http://www.jfree.org/jfreechart/devguide.html

  • How to change heap memory size for general java applications (not applets)

    Hi. I made a java class which manipulates images and I sometimes get an out of memory error when the files are large. In these cases I can run it successfully from the command line using:
    java -Xms32m -Xmx128m myappbut as I run this class from a firefox extension, I can't use this technique.
    Could some one tell me how to set this globally? I've found a lot of info on setting it for applets in the control panel but that's it. I also tried editing my deployment.properties file by adding:
    deployment.javapi.jre.1.6.0_11-b03.args=-Xmx128mbut none of these options seem to work.
    Thanks for any help.

    Also you can use use [JAVA_TOOL_OPTIONS|http://java.sun.com/j2se/1.5.0/docs/guide/jvmti/jvmti.html#tooloptions], with more documentation here. JAVA_TOOLS_OPTIONS is available since 1.5. There is no direct documentation on [_JAVA_OPTIONS|http://java.sun.com/j2se/1.5.0/docs/guide/2d/flags.html] but was made available since at least 1.3.
    The recent existing forum thread [Java Programming - How to change the default memory limits for java.|http://forums.sun.com/thread.jspa?threadID=5368323&messageID=10615245&start=36] has a long discussion on the issue.
    You specified you are not using applets, but if you do, I would also suggest you use the next Generation Plug-in (since 1.6.0_10) that allows you specify the max memory in the applet without having to instruct the user how to make the change. See [JAVA_ARGUMENTS|https://jdk6.dev.java.net/plugin2/#JAVA_ARGUMENTS] for applets. Java Webstart uses resources.

  • How to reduce CPU utilization time in Java Application

    Hi,
    I have created a Java Application. It is a 3-tier architecture. While running my Java application, the CPU utilization percentage shots up to 100 %. I feel that it will affect the system performance and it will hang up the system also.
    If any body know the solution to reduce the CPU utilization or links, please post it.
    Thanks in advance.
    Kennedy

    I know Java class file must be interpreted by VM. but
    Visual Basic is also a language to be interpreted. Why
    it run faster than Java? As Java running speed is
    concerned, it's unwise to apply to the
    enterprise-level application. Now I can't endure Java
    running speed. I wander to know whether it is
    associated with operating system or not.1. Java is nto interpreted in modern (since 1997 or earlier) JVM's - it is compiled into machine code as it is executed via a JIT or a Dynamic compiler (like HotSpot).
    2. VB (5 and later) is also not truely interpreted - in fact it uses the same excellent native code generator used by Visual C++.
    3. Java is principally used these days for enterprise server-based systems where it performs extremely well - or extremely poorly as does C++ in the hands of people who don't know how to use it.
    4. Different JVM's (and in some cases the same JVM hosted on different OS's) perform at different speeds - your mileage will vary. The OS has little influence on the computational speed of java but can highly influence its network, disk and graphics performance, as does hardware configuration (local console versus X terminal - Swing sucks on X Term).
    Chuck

  • Can we wrap a RFC as webservice  and use from external java application ?

    Hi Friends ,
                         Our scenario is  call a webservice ( wrapped form of RFC)  from a external  java application  which will pass the input to that webservice and get back the result  .
                          How XI will play a role here ?
                          Can we wrap a rfc as web service  ?
                           Any blogs for that ?
                          Can you please give a brief details about this ?
                          Expecting yoour asap
    Best Regards .,
    V.Rangarajan

    Hi
    Can we wrap a rfc as web service ?
    Yes.
    <i>To use the SAP Web AS 6.40 you need to build a wrapper in the 6.40 system. This is a remote function call (RFC) enabled function module with the same interface or a similar interface that internally calls the required RFC-enabled function module in the old 4.6x system via RFC. The wrapper then can be exposed to the outside world as a Web service. Another option is to use the Integration Broker capabilities for calling Web services in an older system.</i>
    How XI will play a role here ?
    XI will pass the input to the external java application and get back the result to the webservice
    regards
    krishna

  • Pl help ! ! Opening a servlet URL using stand aline java application

    Hi Guys, I have a standalone java application. This application will get executed after some by some thread. What I want to do is when this java application is executed, automatically open a URL in internet explorer which is of my servler/jsp and pass the parameters to this servlet/jsp. This servler jsp will intern use EJB and other services to get the data and display it.
    How should I automatically open a IE window and pass parameters using this standalone application.
    Pl help ! ! !
    thanks , Ava

    do you want to open internet explorer, or just access the servlet without internet explorer?
    if you want to use internet explorer, you'd want to use
    Runtime.exec,
    if you want to access the Servlet w/o ie, you would use
    URL, and HttpURLConnection classes

  • How to use Entrust with java application on unix platform

    Hi all,
    i have question regarding the use of Entrust with java application on unix
    1)I want to use Entrust for encryption/decryption of the file in my core java application on unix platform.
    What should be requiremnet for the same and how it is implemented?.
    2) I want to Use Entrust for Authentication purpose in my java based web application on unix platform.
    What are requirements for Entrust Authentication and how it is implemented ?

    any one has solution?

  • Using wget in java application

    Hello.
    I want use 'wget' command from my Java application
    for 'wget' i created command as String type.
    Here is it
    String url_str=wget --post-data "year=2009&month=08&day=01&time=0&profile=1&start=0&stop=1000&step=50&par=&format=0&vars=01&vars=02" http://testsite.com/cgi/script.cgi -O /home/user/test_wget.txt
    then i use it in exec method
    try{
    Runtime rt = Runtime.getRuntime();
    Process p = rt.exec(url_str);
    p.waitFor();
    BufferedReader r = new BufferedReader(
    new InputStreamReader(p.getErrorStream()));
    String s;
    while ((s = r.readLine())!=null) {
    System.out.println( s );
    r.close();
    catch (IOException e){
         // TODO Auto-generated catch block
         e.printStackTrace();
    catch ( InterruptedException e ) {
         e.printStackTrace();
    after running the file test_wget.txt hold
    Error
    Wrong key: not alpha/numerical characters
    however, if i use my url_str from Linux command line
    test_wget.txt is hold usefull data.
    So, how working correct with wget from Java application?
    Thanks for any replys

    So, how working correct with wget from Java application?You don't use it; you use Apache HttpClient in stead which can do exactly the same and more without you needing to call platform specific command line tools.
    In any case if you must go down this path, read this article front to back:
    http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html

  • How to use pda with java application

    hi all,
    i m new to J2ME technology. i have never worked on it. now i want to create java application which communicates with PDA.
    can anyone pls provide me the tutorial link for the same. i m looking in the google but till now i have not got any thing which will give me example of java applicatiion with PDA.
    pls help me out guys.
    thnx in adv.
    regards
    ritu

    hello all,
    i am new to PDA developemt
    i want to create a application in java for PDA using win CE tomcatspring framework
    pls send me some site that have sample code for creating applincation for PDA using java.
    thanks

  • How do I run multiple java apps in one JVM to reduce memory use?

    Hi all,
    I saw an article either on the web or in a magazine not too long ago about how to "detect" if the app is already running, and if so, it hands off the new instance to the already running JVM, which then creates a thread to run the Java app in. As it turns out, my app will be used in an ASP environment, through Citrix. We may have as many as 50 to 100 users running the same app, each with their own unique user ID, but all using the same one server to run it on. Each instance eats up 25MB of memory right now. So the question is if anybody knows of a URL or an app like this that can handle the process of running the same (or even different Java) apps in one JVM as separate threads, instead of requring several instances of the JVM to run? I know this article presented a fully working example, and I believe I know enough to do it but I wanted ot use the article as a reference to make sure it is done right. I know that each app basically would use the same one "launcher" program that would on first launch "listen" to a port, as well as send a message through the port to see if an existing launcher was running. If it does, it hands off the Java app to be run to the existing luancher application and shuts down the 2nd launching app. By using this method, the JVM eats up its normal memory, but each Java app only consumes its necessary memory as well and doesn't use up more JVM instance memory.
    Thanks.

    <pre>
    import java.util.Properties;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.lang.reflect.Method;
    import java.lang.reflect.InvocationTargetException;
    import java.util.Enumeration;
    import java.util.NoSuchElementException;
    public class RunProg implements Runnable, Cloneable
    private String iProg;
    private String iArgs[];
    public static void main(String args[])
    new RunProg().main();
    // first step is to start main program itself
    private void main()
    Properties properties = System.getProperties();
    try
    properties.load(new FileInputStream("RunProg.properties"));
    catch(IOException e)
    System.setProperties(properties);
    int i = 0;
    System.out.println("enter main, activeCount=" + Thread.activeCount());
    while(true)
    String program = properties.getProperty("Prog" + i);
    if(program == null)
    break;
    StringTokenizer st = new StringTokenizer(program);
    String[] args = new String[st.countTokens() - 1];
    try
    RunProg rp = (RunProg)this.clone();
    rp.iProg = st.nextToken();
    for(int j = 0; st.hasMoreTokens(); j++)
         args[j] = st.nextToken();
    rp.iArgs = args;
    Thread th = new Thread(rp);
    th.setName("prog" + i + "=" + program);
    th.start();
    System.out.println("prog" + i + "=" + program + ", started");
    catch(CloneNotSupportedException e)
    System.out.println("prog" + i + "=" + program + ", can't start");
    i++;
         System.out.println("end of main, activeCount=" + Thread.activeCount());
    // next step is to start all others one by one
    public void run()
    try
    Class c = Class.forName(iProg);
    Class p[] = new Class[1];
    p[0] = String[].class;
    Method m = c.getMethod("main", p);
    Object o[] = new Object[1];
    o[0] = iArgs;
    m.invoke(null, o);
    catch(ClassNotFoundException e)
    System.out.println(iProg + "ClassNotFoundException");
    catch(NoSuchMethodException e)
    System.out.println(iProg + "NoSuchMethodException");
    catch(InvocationTargetException e)
    System.out.println(iProg + "NoSuchMethodException");
    catch(IllegalAccessException e)
    System.out.println(iProg + "NoSuchMethodException");
    System.out.println(Thread.currentThread().getName() + ", ended");
    System.out.println("exit run, activeCount=" + Thread.activeCount());
    // setup SecurityManager to disable method System.exit()
    public RunProg()
         SecurityManager sm = new mySecurityManager();
         System.setSecurityManager(sm);
    // inner-class to disable method System.exit()
    protected class mySecurityManager extends SecurityManager
         public void checkExit(int status)
              super.checkExit(status);
              Thread.currentThread().stop();
              throw new SecurityException();
    * inner-class to analyze StringTokenizer. This class is enhanced to check double Quotation marks
    protected class StringTokenizer implements Enumeration
    private int currentPosition;
    private int maxPosition;
    private String str;
    private String delimiters;
    private boolean retTokens;
    * Constructs a string tokenizer for the specified string. All
    * characters in the <code>delim</code> argument are the delimiters
    * for separating tokens.
    * <p>
    * If the <code>returnTokens</code> flag is <code>true</code>, then
    * the delimiter characters are also returned as tokens. Each
    * delimiter is returned as a string of length one. If the flag is
    * <code>false</code>, the delimiter characters are skipped and only
    * serve as separators between tokens.
    * @param str a string to be parsed.
    * @param delim the delimiters.
    * @param returnTokens flag indicating whether to return the delimiters
    * as tokens.
    public StringTokenizer(String str, String delim, boolean returnTokens)
    currentPosition = 0;
    this.str = str;
    maxPosition = str.length();
    delimiters = delim;
    retTokens = returnTokens;
    * Constructs a string tokenizer for the specified string. The
    * characters in the <code>delim</code> argument are the delimiters
    * for separating tokens. Delimiter characters themselves will not
    * be treated as tokens.
    * @param str a string to be parsed.
    * @param delim the delimiters.
    public StringTokenizer(String str, String delim)
    this(str, delim, false);
    * Constructs a string tokenizer for the specified string. The
    * tokenizer uses the default delimiter set, which is
    * <code>"&#92;t&#92;n&#92;r&#92;f"</code>: the space character, the tab
    * character, the newline character, the carriage-return character,
    * and the form-feed character. Delimiter characters themselves will
    * not be treated as tokens.
    * @param str a string to be parsed.
    public StringTokenizer(String str)
    this(str, " \t\n\r\f", false);
    * Skips delimiters.
    protected void skipDelimiters()
    while(!retTokens &&
    (currentPosition < maxPosition) &&
    (delimiters.indexOf(str.charAt(currentPosition)) >= 0))
    currentPosition++;
    * Tests if there are more tokens available from this tokenizer's string.
    * If this method returns <tt>true</tt>, then a subsequent call to
    * <tt>nextToken</tt> with no argument will successfully return a token.
    * @return <code>true</code> if and only if there is at least one token
    * in the string after the current position; <code>false</code>
    * otherwise.
    public boolean hasMoreTokens()
    skipDelimiters();
    return(currentPosition < maxPosition);
    * Returns the next token from this string tokenizer.
    * @return the next token from this string tokenizer.
    * @exception NoSuchElementException if there are no more tokens in this
    * tokenizer's string.
    public String nextToken()
    skipDelimiters();
    if(currentPosition >= maxPosition)
    throw new NoSuchElementException();
    int start = currentPosition;
    boolean inQuotation = false;
    while((currentPosition < maxPosition) &&
    (delimiters.indexOf(str.charAt(currentPosition)) < 0 || inQuotation))
    if(str.charAt(currentPosition) == '"')
    inQuotation = !inQuotation;
    currentPosition++;
    if(retTokens && (start == currentPosition) &&
    (delimiters.indexOf(str.charAt(currentPosition)) >= 0))
    currentPosition++;
    String s = str.substring(start, currentPosition);
    if(s.charAt(0) == '"')
    s = s.substring(1);
    if(s.charAt(s.length() - 1) == '"')
    s = s.substring(0, s.length() - 1);
    return s;
    * Returns the next token in this string tokenizer's string. First,
    * the set of characters considered to be delimiters by this
    * <tt>StringTokenizer</tt> object is changed to be the characters in
    * the string <tt>delim</tt>. Then the next token in the string
    * after the current position is returned. The current position is
    * advanced beyond the recognized token. The new delimiter set
    * remains the default after this call.
    * @param delim the new delimiters.
    * @return the next token, after switching to the new delimiter set.
    * @exception NoSuchElementException if there are no more tokens in this
    * tokenizer's string.
    public String nextToken(String delim)
    delimiters = delim;
    return nextToken();
    * Returns the same value as the <code>hasMoreTokens</code>
    * method. It exists so that this class can implement the
    * <code>Enumeration</code> interface.
    * @return <code>true</code> if there are more tokens;
    * <code>false</code> otherwise.
    * @see java.util.Enumeration
    * @see java.util.StringTokenizer#hasMoreTokens()
    public boolean hasMoreElements()
    return hasMoreTokens();
    * Returns the same value as the <code>nextToken</code> method,
    * except that its declared return value is <code>Object</code> rather than
    * <code>String</code>. It exists so that this class can implement the
    * <code>Enumeration</code> interface.
    * @return the next token in the string.
    * @exception NoSuchElementException if there are no more tokens in this
    * tokenizer's string.
    * @see java.util.Enumeration
    * @see java.util.StringTokenizer#nextToken()
    public Object nextElement()
    return nextToken();
    * Calculates the number of times that this tokenizer's
    * <code>nextToken</code> method can be called before it generates an
    * exception. The current position is not advanced.
    * @return the number of tokens remaining in the string using the current
    * delimiter set.
    * @see java.util.StringTokenizer#nextToken()
    public int countTokens()
    int count = 0;
    int currpos = currentPosition;
    while(currpos < maxPosition)
    * This is just skipDelimiters(); but it does not affect
    * currentPosition.
    while(!retTokens &&
    (currpos < maxPosition) &&
    (delimiters.indexOf(str.charAt(currpos)) >= 0))
    currpos++;
    if(currpos >= maxPosition)
    break;
    int start = currpos;
    boolean inQuotation = false;
    while((currpos < maxPosition) &&
    (delimiters.indexOf(str.charAt(currpos)) < 0 || inQuotation))
    if(str.charAt(currpos) == '"')
    inQuotation = !inQuotation;
    currpos++;
    if(retTokens && (start == currpos) &&
    (delimiters.indexOf(str.charAt(currpos)) >= 0))
    currpos++;
    count++;
    return count;
    </pre>
    RunProg.properties like this:
    Prog1=GetEnv 47838 837489 892374 839274
    Prog0=GetEnv "djkfds dfkljsd" dsklfj

  • Printing PDF by using ActiveX in java application

    Hi All,
    I'm working on an application that creates pdf documents. The aim is to make a silent printing of these documents so without any user action.
    I tried several solution. I tried PrintJob from javax.print and Desktop from java.awt. I'm not satisfy by these both solution.
    So now I would like to use Acrobat through the COM interface.
    Could you indicate to me where I can find a documentation or some examples of implementtion about this interface and its usage into java. I googled but I found not example of implementaiton ?
    Thanks
    S.

    Ok .... .
    I tried in java by using jacob the following code to use Acrobat but I found no information regarding the call of the Acrobat functions (open file, print file, ...)
    My exemple is :  
    ComThread.InitSTA();
    ActiveXComponent oAcroPDF = new ActiveXComponent("AcroPDF.PDF");
      try {
       oAcroPDF.invoke("LoadFile", fileName);
       oAcroPDF.invoke("PrintAll");

  • Is it correct to say you can never have a memory leak in a java application

    Also, what is the reasoning/advantage behind the developer not being allowed to explicitly call the garbage collector? Seems a simple thing to allow and would it not get rid of all the timing problems caused by the unpredictability of when the GC will run?

    Not only dispose of Window but also close of Input/OutputStream,My experience is failing to close streams won't cause any leaks (for a file output stream, changes just aren't being reflected in the file).
    cancel of Timer andWhich timer? AFAIK they (swing/util) both use a Thread and there's no need to let go of any native resource.
    dispose of Graphics.Not always (eg if you override paintComponent you shouldn't dispose of your Graphics object)
    Who says it's the responibility of the programmer to "release stuff that uses native handles" and how
    do you know? I consider this a flagrant breach of the Golden Rule of GC (you let go of the object
    reference and we collect the garbage). It's a mine may will step on because information about it is
    hidden in the documentation.And how would that happen? The finalize method isn't guaranteed to be called (correct me if I'm wrong) in certain conditions, so there really is no place to put the cleanup code (except for a finally block or shutdown hook in the code that created the object). I don't think mentioning something in the documentation is the same thing as hiding information.
    If you use like SWT then it's explicitly mentioned that you're responsible so there's no one to blame.I recently read that article. I think it's good practice to follow that rule.
    When the JVM process terminates the OS can reclaim all resources it has allocated, including what the
    Java program leaked.Do you have any proof of this?

  • Probleme with my InterMedia used in my JAVA application

    Hi,
    I wanted to import my OrdImage to my Java code using this code :
    OrdImage imgObj = (OrdImage) rset.getORAData(1, OrdImage.getORADataFactory() );
    But it doesnt know the method OrdImage.getORADataFactory(), when I checked all the methods available in my OrdImage Class, there is no getORADataFactory(), there is only getFactory() which didnt work, is there other methods or codes to deal with my probleme ?
    Thanks

    Try to reset the phone by holding the sleep and home button for about 10sec, until the Apple logo comes back again. You will not lose any data by resetting, but it can cure some glitches.
    If this does not help, setting it up as new device would be the next step:
    How to erase your iOS device and then set it up as a new device or restore it from backups

Maybe you are looking for