Re: Tomcat 5.5 classloading behavior

2008-01-28 Thread Michel Betancourt
Thanks for the reply.  This is tough to provide an example for.  Let me see
what I can work out.

On Jan 16, 2008 11:08 PM, Caldarale, Charles R [EMAIL PROTECTED]
wrote:

  From: Michel Betancourt [mailto:[EMAIL PROTECTED]
  Subject: Tomcat 5.5 classloading behavior
 
  its not too clear whether circular dependecies such as
  the one I am investigating below are legal or supported
  by Tomcat.

 Detection of circular dependencies is not the responsibility of any
 classloader, let alone a Java application such as Tomcat.  Such
 determination is done by the core JVM.

  Sun J2SE 5.0 classloader does not seem to support such
  initialization

 Neither of your examples involves a true circular dependency, and they
 both work fine for me on JDK 1.5 and 1.6.  Perhaps you can supply a real
 example.

  - Chuck


 THIS COMMUNICATION MAY CONTAIN CONFIDENTIAL AND/OR OTHERWISE PROPRIETARY
 MATERIAL and is thus for use only by the intended recipient. If you
 received this in error, please contact the sender and delete the e-mail
 and its attachments from all computers.

 -
 To start a new topic, e-mail: users@tomcat.apache.org
 To unsubscribe, e-mail: [EMAIL PROTECTED]
 For additional commands, e-mail: [EMAIL PROTECTED]




-- 
-Michel


Tomcat 5.5 classloading behavior

2008-01-16 Thread Michel Betancourt
Hi,

I am wondering if someone may be able to point me in the right direction
here...  after reviewing the J2SE spec, and the Servlet 2.4 Spec, its not
too clear whether circular dependecies  such as the one I am investigating
below are legal or supported by Tomcat.  Sun J2SE 5.0 classloader does not
seem to support such initialization although the Tomcat classloader (v5.5)
seems to an operation such as my example below.

An exert of the Java specification states:
12.4.2, #3 If initialization is in progress for the class or interface by
the current thread, then this must be a recursive request for
initialization. Release the lock on the Class object and complete normally.

Servlet 2.4 spec says that Classloaders need to follow the J2SE
specification.


So as I am investigating the Tomcat 5.5 classloader I am wondering if either
one of these situations are legal for Tomcat 5.5 or whether I should be
observing a ClassCircularityError... debugging my App shows the following
behavior:

Examples :

Class A {

static {
System.out.println(B.somefield); // debugger shows that A is checked and the
static block is invoked.  B is loaded which initializes B.somefield through
the constructor of A.
}


}

Class B {
public static final A somefield;
}

and/or circular dependecy from Parent static initializers

Class Parent {
static {
System.out.println(B.somefield); // debugger shows A is checked, Parent is
loaded which loads B which loads somefield through the constructor of class
A
}
}

Class A extends Parent {
}

Class B {
public static final A somefield;
}

Thanks in advance.

Best Regards,
Mich


Re: Tomcat 5.5 classloading behavior

2008-01-16 Thread Johnny Kewl


What language is this guy talking  ha ha.
This has got to be for a thesis or something or its attempted suicide ;)

- Original Message - 
From: Michel Betancourt [EMAIL PROTECTED]

To: users@tomcat.apache.org
Sent: Thursday, January 17, 2008 3:33 AM
Subject: Tomcat 5.5 classloading behavior



Hi,

I am wondering if someone may be able to point me in the right direction
here...  after reviewing the J2SE spec, and the Servlet 2.4 Spec, its not
too clear whether circular dependecies  such as the one I am investigating
below are legal or supported by Tomcat.  Sun J2SE 5.0 classloader does not
seem to support such initialization although the Tomcat classloader (v5.5)
seems to an operation such as my example below.

An exert of the Java specification states:
12.4.2, #3 If initialization is in progress for the class or interface by
the current thread, then this must be a recursive request for
initialization. Release the lock on the Class object and complete 
normally.


You know what you should do... find a little custom class loader example on 
the web and run it through a debugger.
They look simple but when you actually watch them work, and how reentrent 
the things are, this will hopefully all start to make sense.


I think most guys havnt even started thinking about this... 
ClassCircularityError Wow! dont trap that in my code ;)


This is what I think the normal system classloader, and the tomcat 
classloader when it comes to threads and reentrant code will
behave exactly the same... the reason is that one class loader inherets from 
another and thus one can expect the behavior to be similar.
The only diffirence is where the tomcat classloader will look for jars and 
class's.


ie the same stuff is happening but when it comes time to find Your 
Class... it will look for it in the web-app, after that i think

its much of a muchness.
Thats different because outside of web servlets... class loaders are not 
allowed to work like that... they always ask the classloader
above them if it has the class already, if not the parent class loader 
tries to find it, and ONLY if it cant find it, will the child classloader

try and get it.

If you watch a cl working you'll see that recursive request stuff 
happenning... and I'm no academic, in plain talk it just means
that all those dependencies must be gotten out of the way, before the next 
thread can come in and ask for a class to load.
So if A - B - C and thread one is busy with A, and thread 2 really just 
wants C it has to wait, because otherwise
C would load... and then A would eventually get to it and it would load 
again because its already kicked off that recursive pattern.
Then because C is waiting A will actually will have done it already... 
and the cl will then just say... thread 2, you lucky, class is loaded, you 
can go now.


Normal CL or Tomcat no diffs.

The other thing with these examples is that yes I guess it is possible to be 
surprised in the way STATIC variables are inited in complex
class structure... but remember is LOADING, not INSTANTIATING the class, 
that comes later outside of the CL, so in most cases

it not an issue one would even encounter.

I dont think its possible to make an ClassCircularityError error with a 
modern IDE... I dont think it will let you compile the code


Class A extends A

so if you actually making these classes and compiling them I dont think 
its possible to simulate it without hacking byte code.

 be interesting to hear if anyone ever seen that.

Thanks... I never ever thought about static variables before... and I've 
never seen it in practical code.
ie I think in normal code a programmer may go what the... I thought 
static A was going to be 5, why is it 10, or whatever...
and then eventually see the curcular RELATIONSHIP but I doubt that would 
cause an error.
If its compiling... I dont think you can break a classloader... short of it 
just cant find the Jar


interesting things these classloaders... good luck.
If its practical stuff... I can help you a little, heavy specs and theory... 
you on your own ;)



Servlet 2.4 spec says that Classloaders need to follow the J2SE
specification.


So as I am investigating the Tomcat 5.5 classloader I am wondering if 
either

one of these situations are legal for Tomcat 5.5 or whether I should be
observing a ClassCircularityError... debugging my App shows the following
behavior:

Examples :

Class A {

static {
System.out.println(B.somefield); // debugger shows that A is checked and 
the
static block is invoked.  B is loaded which initializes B.somefield 
through

the constructor of A.
}


}

Class B {
public static final A somefield;
}

and/or circular dependecy from Parent static initializers

Class Parent {
static {
System.out.println(B.somefield); // debugger shows A is checked, Parent is
loaded which loads B which loads somefield through the constructor of 
class

A
}
}

Class A extends Parent {
}

Class B

Re: Tomcat 5.5 classloading behavior

2008-01-16 Thread Gabe Wong

Johnny Kewl wrote:


What language is this guy talking  ha ha.
This has got to be for a thesis or something or its attempted 
suicide ;)


- Original Message - From: Michel Betancourt 
[EMAIL PROTECTED]

To: users@tomcat.apache.org
Sent: Thursday, January 17, 2008 3:33 AM
Subject: Tomcat 5.5 classloading behavior



Hi,

I am wondering if someone may be able to point me in the right direction
here...  after reviewing the J2SE spec, and the Servlet 2.4 Spec, its 
not
too clear whether circular dependecies  such as the one I am 
investigating
below are legal or supported by Tomcat.  Sun J2SE 5.0 classloader 
does not
seem to support such initialization although the Tomcat classloader 
(v5.5)

seems to an operation such as my example below.

An exert of the Java specification states:
12.4.2, #3 If initialization is in progress for the class or 
interface by

the current thread, then this must be a recursive request for
initialization. Release the lock on the Class object and complete 
normally.


You know what you should do... find a little custom class loader 
example on the web and run it through a debugger.
They look simple but when you actually watch them work, and how 
reentrent the things are, this will hopefully all start to make sense.


I think most guys havnt even started thinking about this... 
ClassCircularityError Wow! dont trap that in my code ;)


This is what I think the normal system classloader, and the tomcat 
classloader when it comes to threads and reentrant code will
behave exactly the same... the reason is that one class loader 
inherets from another and thus one can expect the behavior to be similar.
The only diffirence is where the tomcat classloader will look for jars 
and class's.


ie the same stuff is happening but when it comes time to find Your 
Class... it will look for it in the web-app, after that i think

its much of a muchness.
Thats different because outside of web servlets... class loaders are 
not allowed to work like that... they always ask the classloader
above them if it has the class already, if not the parent class 
loader tries to find it, and ONLY if it cant find it, will the child 
classloader

try and get it.

If you watch a cl working you'll see that recursive request stuff 
happenning... and I'm no academic, in plain talk it just means
that all those dependencies must be gotten out of the way, before the 
next thread can come in and ask for a class to load.
So if A - B - C and thread one is busy with A, and thread 2 really 
just wants C it has to wait, because otherwise
C would load... and then A would eventually get to it and it would 
load again because its already kicked off that recursive pattern.
Then because C is waiting A will actually will have done it 
already... and the cl will then just say... thread 2, you lucky, class 
is loaded, you can go now.


Normal CL or Tomcat no diffs.

The other thing with these examples is that yes I guess it is possible 
to be surprised in the way STATIC variables are inited in complex
class structure... but remember is LOADING, not INSTANTIATING the 
class, that comes later outside of the CL, so in most cases

it not an issue one would even encounter.

I dont think its possible to make an ClassCircularityError error with 
a modern IDE... I dont think it will let you compile the code


Class A extends A

so if you actually making these classes and compiling them I dont 
think its possible to simulate it without hacking byte code.

 be interesting to hear if anyone ever seen that.

Thanks... I never ever thought about static variables before... and 
I've never seen it in practical code.
ie I think in normal code a programmer may go what the... I 
thought static A was going to be 5, why is it 10, or whatever...
and then eventually see the curcular RELATIONSHIP but I doubt that 
would cause an error.
If its compiling... I dont think you can break a classloader... short 
of it just cant find the Jar


interesting things these classloaders... good luck.
If its practical stuff... I can help you a little, heavy specs and 
theory... you on your own ;)
Nice analysis Johnny. To add to your thought (even though slightly off 
topic) -
Yes there is a big difference between theory (specification) and 
practice (implementation).

So it may be confusing for someone starting off from the theoretical side.


--
Regards

Gabe Wong
NGASI AppServer Manager
JAVA AUTOMATION and SaaS Enablement
a href=http://www.ngasi.comhttp://www.ngasi.com/a
NEW! 8.0 - Centrally manage multiple physical servers


-
To start a new topic, e-mail: users@tomcat.apache.org
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]



RE: Tomcat 5.5 classloading behavior

2008-01-16 Thread Caldarale, Charles R
 From: Michel Betancourt [mailto:[EMAIL PROTECTED] 
 Subject: Tomcat 5.5 classloading behavior
 
 its not too clear whether circular dependecies such as 
 the one I am investigating below are legal or supported
 by Tomcat.

Detection of circular dependencies is not the responsibility of any
classloader, let alone a Java application such as Tomcat.  Such
determination is done by the core JVM.

 Sun J2SE 5.0 classloader does not seem to support such
 initialization 

Neither of your examples involves a true circular dependency, and they
both work fine for me on JDK 1.5 and 1.6.  Perhaps you can supply a real
example.

 - Chuck


THIS COMMUNICATION MAY CONTAIN CONFIDENTIAL AND/OR OTHERWISE PROPRIETARY
MATERIAL and is thus for use only by the intended recipient. If you
received this in error, please contact the sender and delete the e-mail
and its attachments from all computers.

-
To start a new topic, e-mail: users@tomcat.apache.org
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]