You see, your scenario couldn't exactly happen:
The garbage collector cleans all class instances (in this case only one
instance), but not the class itself. The class loader does not unload the class
bytecode, and the static fields do not reside in any of the class instances that
are released by the garbage collector. So the static fields shouldn't be lost
after garbage colection of the class instances.

Lachezar Dobrev wrote:

>    Hi.
>    This MAY be totally wrong, but I have seen that in a different place in a
> different problem, in a different need. I got the same thing.
>
>    Problem: Static varialbles are being reset from time to time.
>
>    My Answer: The lifetime of the Servlets/EJBs/JSPs is defined by how the
> webcontainer/ejbcontainer handles requests and persistance. My GUESS is that
> this problem is as follows:
>
>    1. We load a class (Say MYClass)
>    2. We use MYClass
>    3. We free of use all objects of type MYClass.
>      --- Some time passes.
>      --- The Garbage Collector sees this class is not used anymore and...
> FREES IT!
>    4. We try to use MYClass. It doesn't exist, so it is loaded.
>      --- On loading the static fields are reset.
>
>    Now... Having in mind, that the Servlets/JSPs can be randomly freed by
> the container (Orion) this situation is quite real. Especialy if we use that
> Servlet/JSP not-so-often.
>
>    My Resolution: Use a Singleton Class to keep all the needed Static
> information:
>
> /** @todo Modify this class to suit your needs */
>
>    public class StaticHolder{
>      private int Data = 0;
>
>      private static StaticHolder theCopy = new StaticHolder();
>
>      private StaticHolder(){}
>
>      public  static StaticHolder getCopy() { return theCopy; }
>
>      public void incData() { Data++; }
>      public int  getData() { return Data; }
>
>    }
>
> /** @usage */
>    StaticHolder.getCopy().incData();
>    int count = Staticholder.getCopy().getData();
>
>    Singleton classes are not disposed by the garbage collector (there is
> always one reference to the object from the object itself).
>
>    Another way is to define an instance of your servlet, that will hold a
> copy of itself :).
>
>    public class MyServlet .......{
>
>      private static MyServlet CopyHolder = new MyServlet();
>
>    }
>
>    This will keep your class always loaded.
>
>    Hope this helps.
>    Lachezar
>
> > Sorry, But I do not understand what you mean.
> > What I want is to have only a counter for all the requests.
> >
> >
> > At 13:35 24/07/2001 -0500, you wrote:
> > >Instead of static I would use a member attribute, since for servlets
> > >only one instance exists for a given class.
> > >
> > >Ismael wrote:
> > >
> > > >  I am making some loading tests, in order to test the loading tool I
> > > > have written some special jsp to deal verify the number of times a jsp
> > > > has been called.
> > > > My jsp is :
> > > >
> > > > <%@page contentType="text/html"%>
> > > > <html>
> > > > <head><title>JSP Page</title></head>
> > > > <body>
> > > > <%!
> > > > static int client=0;
> > > > static String attribute_name="client";
> > > > static Object lock=new Object();
> > > > %>
> > > > <%-- This JSP will be used with 4 other jsp to test the correctness of
> > > > the stress tool
> > > > --%>
> > > > <%
> > > > synchronized (application) {
> > > > session.setAttribute(attribute_name,new Integer(++client));
> > > > System.out.println("Entering client "+client);
> > > >
> > > >
> > > > }
> > > > %>
> > > > </body>
> > > > </html>:
> > > >
> > > >
> > > > It is very simple but the ouput I get is
> > > > Entering client  1
> > > > Entering client  2
> > > > Entering client  3
> > > > Entering client  4
> > > > Entering client  1
> > > > Entering client  1
> > > > Entering client  1
> > > > Entering client  1
> > > > Entering client  1
> > > > Entering client  5
> > > > Entering client  2
> > > > Entering client  3
> > > > Entering client  4
> > > > Entering client  5
> > > > Entering client  6
> > > > Entering client  7
> > > > Entering client  8
> > > > Entering client  9
> > > > Entering client  10
> > > > Entering client  11
> > > > Entering client  12
> > > > Entering client  13
> > > > Entering client  14
> > > > Entering client  15
> > > > Entering client  16
> > > > ..
> > > > That is, my static variable it is being ignored. I am using Orion
> > > > 1.4.5 , Windows 2000 and J2SE 1.3.0_02.
> > > >
> > > > Anybody know why this could be happening ?
> > > >
> > > > Regards,
> > > > Ismael
> > > >
> > > >
> >
> >


Reply via email to