Set s1 = (Set)((Map.Entry)o1).getValue();
Set s2 = (Set)((Map.Entry)o2).getValue();
return s2.size() - s1.size();
}
});
return new Itr(v);
default:
throw new IllegalArgumentException();
}
}
// Iterates over the given collection of map entries
static private class Itr implements Iterator {
Iterator i;
Itr(Collection c) {
i = c.iterator();
}
public boolean hasNext () {
return i.hasNext();
}
public Object next () {
Map.Entry entry = (Map.Entry)i.next();
return entry.getKey()+": "+((Set)entry.getValue()).size();
}
public void remove () {
i.remove();
}
}
/** Merges the given graph into this graph and returns the
* combined graph. Any type that appeared in one of the two
* graphs now appears in this graph. If the same instance appears
* in both graphs, it counts only as one instance in the new
* graph. In particular, adding a graph to itself leaves this
* graph unchanged.
*
* @param inst a graph of instances, along with their type names
* @return this graph after the merge
*/
public Instances add (Instances inst) {
Iterator i = inst.allInstances.entrySet().iterator();
while (i.hasNext()) {
Map.Entry e = (Map.Entry)i.next();
String key = (String)e.getKey();
Set more = (Set)e.getValue();
Set s = (Set)allInstances.get(key);
if (s == null)
allInstances.put(key, s = new HashSet());
s.addAll(more);
}
return this;
}
/*
// for debugging purposes
public String toString () {
StringBuffer b = new StringBuffer();
Iterator i = allInstances.keySet().iterator();
while (i.hasNext()) {
Object key = i.next();
b.append("("+key+","+allInstances.get(key)+")\n");
}
return b.toString();
}
*/
public static void main (String[] args) {
Instances inst = new Instances(new Thread() {public void run(){}});
}
}
REPRODUCIBILITY :
This bug can be reproduced always.
(Incident Review ID: 240076)
======================================================================
Name: rmT116609 Date: 03/12/2004
FULL PRODUCT VERSION :
java version "1.4.2"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2-b28)
Java HotSpot(TM) Client VM (build 1.4.2-b28, mixed mode)
java version "1.5.0-beta"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0-beta-b32c)
Java HotSpot(TM) Client VM (build 1.5.0-beta-b32c, mixed mode)
FULL OS VERSION :
Linux berlioz 2.4.20-13.9custom #4 Wed Sep 24 08:56:20 EDT 2003 i686 i686 i386 GNU/Linux
A DESCRIPTION OF THE PROBLEM :
The VM crashes while running a recursive method. The method uses reflection to list all the instances referenced by a Thread object.
ERROR MESSAGES/STACK TRACES THAT OCCUR :
Unexpected Signal : 11 occurred at PC=0x404216B8
Function=(null)+0x404216B8
Library=/usr/java/j2sdk1.4.2/jre/lib/i386/client/libjvm.so
NOTE: We are unable to locate the function name symbol for the error
just occurred. Please refer to release documentation for possible
reason and solutions.
Current Java thread:
at java.lang.Class.getName(Native Method)
at Reflect.Instances.add(Instances.java:36)
at Reflect.Instances.add(Instances.java:57)
at Reflect.Instances.add(Instances.java:57)
at Reflect.Instances.add(Instances.java:46)
at Reflect.Instances.add(Instances.java:57)
at Reflect.Instances.add(Instances.java:57)
at Reflect.Instances.add(Instances.java:57)
at Reflect.Instances.add(Instances.java:57)
at Reflect.Instances.add(Instances.java:57)
at Reflect.Instances.add(Instances.java:46)
at Reflect.Instances.add(Instances.java:57)
at Reflect.Instances.add(Instances.java:57)
at Reflect.Instances.add(Instances.java:57)
at Reflect.Instances.add(Instances.java:57)
at Reflect.Instances.add(Instances.java:57)
at Reflect.Instances.add(Instances.java:46)
at Reflect.Instances.add(Instances.java:57)
at Reflect.Instances.add(Instances.java:57)
at Reflect.Instances.add(Instances.java:57)
at Reflect.Instances.add(Instances.java:57)
at Reflect.Instances.add(Instances.java:46)
at Reflect.Instances.add(Instances.java:57)
at Reflect.Instances.add(Instances.java:57)
at Reflect.Instances.add(Instances.java:57)
at Reflect.Instances.main(Instances.java:121)
Dynamic libraries:
08048000-0804e000 r-xp 00000000 03:07 115900 /usr/java/j2sdk1.4.2/bin/java
0804e000-0804f000 rw-p 00005000 03:07 115900 /usr/java/j2sdk1.4.2/bin/java
40000000-40012000 r-xp 00000000 03:03 48178 /lib/ld-2.3.2.so
40012000-40013000 rw-p 00011000 03:03 48178 /lib/ld-2.3.2.so
40014000-4001c000 r-xp 00000000 03:07 588040 /usr/java/j2sdk1.4.2/jre/lib/i386/native_threads/libhpi.so
4001c000-4001d000 rw-p 00007000 03:07 588040 /usr/java/j2sdk1.4.2/jre/lib/i386/native_threads/libhpi.so
4001d000-40021000 rw-s 00000000 03:03 144855 /tmp/hsperfdata_charpov/7966
40022000-40030000 r-xp 00000000 03:03 48127 /lib/libpthread-0.10.so
40030000-40033000 rw-p 0000e000 03:03 48127 /lib/libpthread-0.10.so
40073000-40075000 r-xp 00000000 03:03 48109 /lib/libdl-2.3.2.so
40075000-40076000 rw-p 00002000 03:03 48109 /lib/libdl-2.3.2.so
40076000-40196000 r-xp 00000000 03:03 48105 /lib/libc-2.3.2.so
40196000-40199000 rw-p 00120000 03:03 48105 /lib/libc-2.3.2.so
4019c000-40593000 r-xp 00000000 03:07 490517 /usr/java/j2sdk1.4.2/jre/lib/i386/client/libjvm.so
40593000-405ae000 rw-p 003f6000 03:07 490517 /usr/java/j2sdk1.4.2/jre/lib/i386/client/libjvm.so
405c1000-405d1000 r-xp 00000000 03:03 48113 /lib/libnsl-2.3.2.so
405d1000-405d2000 rw-p 00010000 03:03 48113 /lib/libnsl-2.3.2.so
405d4000-405f4000 r-xp 00000000 03:03 48111 /lib/libm-2.3.2.so
405f4000-405f5000 rw-p 00020000 03:03 48111 /lib/libm-2.3.2.so
405f5000-405f8000 r--s 00000000 03:07 881428 /usr/java/j2sdk1.4.2/jre/lib/ext/dnsns.jar
405f8000-405fe000 r--s 00000000 03:07 407433 /usr/lib/gconv/gconv-modules.cache
40603000-4060d000 r-xp 00000000 03:03 48192 /lib/libnss_compat-2.3.2.so
4060d000-4060e000 rw-p 00009000 03:03 48192 /lib/libnss_compat-2.3.2.so
4060e000-4061e000 r-xp 00000000 03:07 588047 /usr/java/j2sdk1.4.2/jre/lib/i386/libverify.so
4061e000-40620000 rw-p 0000f000 03:07 588047 /usr/java/j2sdk1.4.2/jre/lib/i386/libverify.so
40620000-40640000 r-xp 00000000 03:07 588048 /usr/java/j2sdk1.4.2/jre/lib/i386/libjava.so
40640000-40642000 rw-p 0001f000 03:07 588048 /usr/java/j2sdk1.4.2/jre/lib/i386/libjava.so
40642000-40656000 r-xp 00000000 03:07 588050 /usr/java/j2sdk1.4.2/jre/lib/i386/libzip.so
40656000-40659000 rw-p 00013000 03:07 588050 /usr/java/j2sdk1.4.2/jre/lib/i386/libzip.so
40659000-41fe4000 r--s 00000000 03:07 588306 /usr/java/j2sdk1.4.2/jre/lib/rt.jar
4202e000-42044000 r--s 00000000 03:07 588277 /usr/java/j2sdk1.4.2/jre/lib/sunrsasign.jar
42044000-4211f000 r--s 00000000 03:07 588303 /usr/java/j2sdk1.4.2/jre/lib/jsse.jar
4211f000-42130000 r--s 00000000 03:07 588278 /usr/java/j2sdk1.4.2/jre/lib/jce.jar
42130000-42689000 r--s 00000000 03:07 588304 /usr/java/j2sdk1.4.2/jre/lib/charsets.jar
44731000-4473e000 r--s 00000000 03:07 881430 /usr/java/j2sdk1.4.2/jre/lib/ext/ldapsec.jar
4c7c0000-4c9c0000 r--p 00000000 03:07 196947 /usr/lib/locale/locale-archive
4c9c0000-4c9dc000 r--s 00000000 03:07 881427 /usr/java/j2sdk1.4.2/jre/lib/ext/sunjce_provider.jar
4c9dc000-4ca98000 r--s 00000000 03:07 881462 /usr/java/j2sdk1.4.2/jre/lib/ext/localedata.jar
Heap at VM Abort:
Heap
def new generation total 576K, used 497K [0x44740000, 0x447e0000, 0x44c20000)
eden space 512K, 97% used [0x44740000, 0x447bc498, 0x447c0000)
from space 64K, 0% used [0x447c0000, 0x447c0000, 0x447d0000)
to space 64K, 0% used [0x447d0000, 0x447d0000, 0x447e0000)
tenured generation total 1408K, used 0K [0x44c20000, 0x44d80000, 0x48740000)
the space 1408K, 0% used [0x44c20000, 0x44c20000, 0x44c20200, 0x44d80000)
compacting perm gen total 4096K, used 1154K [0x48740000, 0x48b40000, 0x4c740000)
the space 4096K, 28% used [0x48740000, 0x48860be8, 0x48860c00, 0x48b40000)
Local Time = Mon Feb 23 17:51:34 2004
Elapsed Time = 2
#
# HotSpot Virtual Machine Error : 11
# Error ID : 4F530E43505002EF
# Please report this error at
# http://java.sun.com/cgi-bin/bugreport.cgi
#
# Java VM: Java HotSpot(TM) Client VM (1.4.2-b28 mixed mode)
#
With 1.5.0 Beta 1:
of type class java.lang.Class
of type class java.lang.String
of type class [C
of type class [Ljava.io.ObjectStreamField;
of type class java.lang.String$CaseInsensitiveComparator
of type class java.lang.Class
of type class [Ljava.io.ObjectStreamField;
of type class sun.reflect.ReflectionFactory
of type class [Ljava.lang.annotation.Annotation;
of type class sun.reflect.UnsafeStaticObjectFieldAccessorImpl
#
# An unexpected error has been detected by HotSpot Virtual Machine:
#
# SIGSEGV (0xb) at pc=0x403473f8, pid=2783, tid=8192
#
# Java VM: Java HotSpot(TM) Client VM (1.5.0-beta-b32c mixed mode)
# Problematic frame:
# V [libjvm.so+0x2e43f8]
#
# An error report file with more information is saved as hs_err_pid2783.log
#
# If you would like to submit a bug report, please visit:
# http://java.sun.com/webapps/bugreport/crash.jsp
Source Code:
package Reflect;
// as is, it crashes
// uncomment line 111 to get a bizarre exception
// (object o seems to "become" null inside String.ValueOf)
// Replace the call to recAdd by iterAdd on line 81 to get the same kind of
// strange thing: ArrayStoreException in Vector.addElement!
import java.util.*;
import java.lang.reflect.*;
/** Explores a graph of instances. Given an object as a starting
* point, all instances reachable from this object are explored. This
* implementation can then provide a list of all the types encountered
* along with the number of occurrences in each type. Different
* graphs can be combined using the <code>add</code> method.
*
* @author Michel Charpentier
* @version 1.0, 02/24/04
* @see Class
* @see <a href="Tests.java">Tests.java</a>
*/
public class Instances {
/** Types are returned in an unspecified order.
*
* @see #iterator
*/
public static final int UNSORTED = 0;
/** Types are returned in alphabetical order of their fully qualified names.
*
* @see #iterator
*/
public static final int SORTED_BY_NAME = 1;
/** Types are returned in decreasing order of the number of
* occurrences in each type.
*
* @see #iterator
*/
public static final int SORTED_BY_OCCURRENCES = 2;
// Keys are type names, values are sets of instances
private final Map allInstances = new TreeMap();
// Wrapper around instances to make java.util stuff rely on ==
// instead of equals()
static private class Instance {
Object instance;
Instance (Object o) {
instance = o;
}
public boolean equals (Object o) {
return ((Instance)o).instance == this.instance;
}
public int hashCode () {
return instance.hashCode();
}
public String toString () { // for debugging purposes
return instance.toString();
}
}
/** Construct a new graph by adding instance <code>o</code> and
* all instances reachable from <code>o</code> to an empty graph. This
* constructor attempts to follow all data members regardless of their
* visibility.
*
* @param o initial instance
* @throws SecurityException if a security manager prevents
* the method from accessing some data member
* @see SecurityManager
*/
public Instances (Object o) throws SecurityException {
if (o == null)
throw new NullPointerException();
recAdd(o, -1);
}
/** Construct a new graph by adding instance <code>o</code> and
* all instances reachable from <code>o</code> within the given
* <code>depth</code> to an empty graph. A depth of 0 only adds object
* <code>o</code>; a depth of 1 adds all the fields of
* <code>o</code>. This constructor attempts to follow all data
* members regardless of their visibility.
*
* @param o initial instance
* @param depth depth of the exploration (maximum distance from
* origin <code>o</code>
* @throws IllegalArgumentException if <code>depth</code> is negative
* @throws SecurityException if a security manager prevents
* the method from accessing some data member
* @see SecurityManager
*/
public Instances (Object o, int depth) throws SecurityException {
if (o == null)
throw new NullPointerException();
if (depth < 0)
throw new IllegalArgumentException("depth cannot be negative.");
recAdd(o, depth+1);
}
// recursive solution
private void recAdd (Object o, int depth) {
if (o == null || depth == 0) return;
Class c = o.getClass();
//System.out.print("Found "+o);
System.out.println(" of type "+c);
String name = c.getName();
Set s = (Set)allInstances.get(name);
if (s == null) // first occurrence of this type
allInstances.put(name, s = new HashSet());
if (s.add(new Instance(o))) {
if (c.isArray() && !c.getComponentType().isPrimitive()) {
int l = Array.getLength(o);
for (int i=0; i<l; i++)
recAdd(Array.get(o, i), depth-1);
return; // is this safe?
}
do {
Field[] fields = c.getDeclaredFields();
AccessibleObject.setAccessible(fields, true);
for (int i=0; i<fields.length; i++) {
Field f = fields[i];
if (!f.getType().isPrimitive())
try {
recAdd(f.get(o), depth-1);
} catch (IllegalAccessException e) {
System.err.println
("Could not follow field "+f+" in "+c);
}
}
c = c.getSuperclass();
} while (c != null);
}
}
// iterative solution
private void iterAdd (Object start, int depth) {
Stack stack1 = new Stack();
stack1.push(start);
while (depth != 0) {
Stack stack2 = new Stack();
while (!stack1.isEmpty()) {
Object o = stack1.pop();
if (o == null) continue;
Class c = o.getClass();
String name = c.getName();
Set s = (Set)allInstances.get(name);
if (s == null) // first occurrence of this type
allInstances.put(name, s = new HashSet());
if (s.add(new Instance(o))) {
if (c.isArray() && !c.getComponentType().isPrimitive()) {
int l = Array.getLength(o);
for (int i=0; i<l; i++)
stack2.push(Array.get(o, i));
continue; // is it safe?
}
do {
Field[] fields = c.getDeclaredFields();
AccessibleObject.setAccessible(fields, true);
for (int i=0; i<fields.length; i++) {
Field f = fields[i];
if (!f.getType().isPrimitive())
try {
stack2.push(f.get(o));
} catch (IllegalAccessException e) {
System.err.println
("Could not follow field "+f+" in "+c);
}
}
c = c.getSuperclass();
} while (c != null);
}
}
if (stack2.isEmpty()) break;
stack1 = stack2;
depth--;
}
}
/** An iterator over all the class names found in the graph. Each call
* to <code>next()</code> returns a <code>String</code>. These
* strings are in no particular order, in alphabetical order, or
* in decreasing order of the number of occurrences of this type,
* depending on the value of <code>type</code>.
*
* @param type specifies the order of iteration
* @return an iterator of class names (as strings), in the specified order
* @see #UNSORTED
* @see #SORTED_BY_NAME
* @see #SORTED_BY_OCCURRENCES
*/
public Iterator iterator (int type) {
switch (type) {
case UNSORTED:
case SORTED_BY_NAME:
return new Itr(allInstances.entrySet());
case SORTED_BY_OCCURRENCES:
Vector v = new Vector(allInstances.entrySet());
Collections.sort(v, new Comparator() {
public int compare (Object o1, Object o2) {
Set s2 = (Set)((Map.Entry)o2).getValue();
return s2.size() - s1.size();
}
});
return new Itr(v);
default:
throw new IllegalArgumentException();
}
}
// Iterates over the given collection of map entries
static private class Itr implements Iterator {
Iterator i;
Itr(Collection c) {
i = c.iterator();
}
public boolean hasNext () {
return i.hasNext();
}
public Object next () {
Map.Entry entry = (Map.Entry)i.next();
return entry.getKey()+": "+((Set)entry.getValue()).size();
}
public void remove () {
i.remove();
}
}
/** Merges the given graph into this graph and returns the
* combined graph. Any type that appeared in one of the two
* graphs now appears in this graph. If the same instance appears
* in both graphs, it counts only as one instance in the new
* graph. In particular, adding a graph to itself leaves this
* graph unchanged.
*
* @param inst a graph of instances, along with their type names
* @return this graph after the merge
*/
public Instances add (Instances inst) {
Iterator i = inst.allInstances.entrySet().iterator();
while (i.hasNext()) {
Map.Entry e = (Map.Entry)i.next();
String key = (String)e.getKey();
Set more = (Set)e.getValue();
Set s = (Set)allInstances.get(key);
if (s == null)
allInstances.put(key, s = new HashSet());
s.addAll(more);
}
return this;
}
/*
// for debugging purposes
public String toString () {
StringBuffer b = new StringBuffer();
Iterator i = allInstances.keySet().iterator();
while (i.hasNext()) {
Object key = i.next();
b.append("("+key+","+allInstances.get(key)+")\n");
}
return b.toString();
}
*/
public static void main (String[] args) {
Instances inst = new Instances(new Thread() {public void run(){}});
}
}
REPRODUCIBILITY :
This bug can be reproduced always.
(Incident Review ID: 240076)
======================================================================
Name: rmT116609 Date: 03/12/2004
FULL PRODUCT VERSION :
java version "1.4.2"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2-b28)
Java HotSpot(TM) Client VM (build 1.4.2-b28, mixed mode)
java version "1.5.0-beta"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0-beta-b32c)
Java HotSpot(TM) Client VM (build 1.5.0-beta-b32c, mixed mode)
FULL OS VERSION :
Linux berlioz 2.4.20-13.9custom #4 Wed Sep 24 08:56:20 EDT 2003 i686 i686 i386 GNU/Linux
A DESCRIPTION OF THE PROBLEM :
The VM crashes while running a recursive method. The method uses reflection to list all the instances referenced by a Thread object.
ERROR MESSAGES/STACK TRACES THAT OCCUR :
Unexpected Signal : 11 occurred at PC=0x404216B8
Function=(null)+0x404216B8
Library=/usr/java/j2sdk1.4.2/jre/lib/i386/client/libjvm.so
NOTE: We are unable to locate the function name symbol for the error
just occurred. Please refer to release documentation for possible
reason and solutions.
Current Java thread:
at java.lang.Class.getName(Native Method)
at Reflect.Instances.add(Instances.java:36)
at Reflect.Instances.add(Instances.java:57)
at Reflect.Instances.add(Instances.java:57)
at Reflect.Instances.add(Instances.java:46)
at Reflect.Instances.add(Instances.java:57)
at Reflect.Instances.add(Instances.java:57)
at Reflect.Instances.add(Instances.java:57)
at Reflect.Instances.add(Instances.java:57)
at Reflect.Instances.add(Instances.java:57)
at Reflect.Instances.add(Instances.java:46)
at Reflect.Instances.add(Instances.java:57)
at Reflect.Instances.add(Instances.java:57)
at Reflect.Instances.add(Instances.java:57)
at Reflect.Instances.add(Instances.java:57)
at Reflect.Instances.add(Instances.java:57)
at Reflect.Instances.add(Instances.java:46)
at Reflect.Instances.add(Instances.java:57)
at Reflect.Instances.add(Instances.java:57)
at Reflect.Instances.add(Instances.java:57)
at Reflect.Instances.add(Instances.java:57)
at Reflect.Instances.add(Instances.java:46)
at Reflect.Instances.add(Instances.java:57)
at Reflect.Instances.add(Instances.java:57)
at Reflect.Instances.add(Instances.java:57)
at Reflect.Instances.main(Instances.java:121)
Dynamic libraries:
08048000-0804e000 r-xp 00000000 03:07 115900 /usr/java/j2sdk1.4.2/bin/java
0804e000-0804f000 rw-p 00005000 03:07 115900 /usr/java/j2sdk1.4.2/bin/java
40000000-40012000 r-xp 00000000 03:03 48178 /lib/ld-2.3.2.so
40012000-40013000 rw-p 00011000 03:03 48178 /lib/ld-2.3.2.so
40014000-4001c000 r-xp 00000000 03:07 588040 /usr/java/j2sdk1.4.2/jre/lib/i386/native_threads/libhpi.so
4001c000-4001d000 rw-p 00007000 03:07 588040 /usr/java/j2sdk1.4.2/jre/lib/i386/native_threads/libhpi.so
4001d000-40021000 rw-s 00000000 03:03 144855 /tmp/hsperfdata_charpov/7966
40022000-40030000 r-xp 00000000 03:03 48127 /lib/libpthread-0.10.so
40030000-40033000 rw-p 0000e000 03:03 48127 /lib/libpthread-0.10.so
40073000-40075000 r-xp 00000000 03:03 48109 /lib/libdl-2.3.2.so
40075000-40076000 rw-p 00002000 03:03 48109 /lib/libdl-2.3.2.so
40076000-40196000 r-xp 00000000 03:03 48105 /lib/libc-2.3.2.so
40196000-40199000 rw-p 00120000 03:03 48105 /lib/libc-2.3.2.so
4019c000-40593000 r-xp 00000000 03:07 490517 /usr/java/j2sdk1.4.2/jre/lib/i386/client/libjvm.so
40593000-405ae000 rw-p 003f6000 03:07 490517 /usr/java/j2sdk1.4.2/jre/lib/i386/client/libjvm.so
405c1000-405d1000 r-xp 00000000 03:03 48113 /lib/libnsl-2.3.2.so
405d1000-405d2000 rw-p 00010000 03:03 48113 /lib/libnsl-2.3.2.so
405d4000-405f4000 r-xp 00000000 03:03 48111 /lib/libm-2.3.2.so
405f4000-405f5000 rw-p 00020000 03:03 48111 /lib/libm-2.3.2.so
405f5000-405f8000 r--s 00000000 03:07 881428 /usr/java/j2sdk1.4.2/jre/lib/ext/dnsns.jar
405f8000-405fe000 r--s 00000000 03:07 407433 /usr/lib/gconv/gconv-modules.cache
40603000-4060d000 r-xp 00000000 03:03 48192 /lib/libnss_compat-2.3.2.so
4060d000-4060e000 rw-p 00009000 03:03 48192 /lib/libnss_compat-2.3.2.so
4060e000-4061e000 r-xp 00000000 03:07 588047 /usr/java/j2sdk1.4.2/jre/lib/i386/libverify.so
4061e000-40620000 rw-p 0000f000 03:07 588047 /usr/java/j2sdk1.4.2/jre/lib/i386/libverify.so
40620000-40640000 r-xp 00000000 03:07 588048 /usr/java/j2sdk1.4.2/jre/lib/i386/libjava.so
40640000-40642000 rw-p 0001f000 03:07 588048 /usr/java/j2sdk1.4.2/jre/lib/i386/libjava.so
40642000-40656000 r-xp 00000000 03:07 588050 /usr/java/j2sdk1.4.2/jre/lib/i386/libzip.so
40656000-40659000 rw-p 00013000 03:07 588050 /usr/java/j2sdk1.4.2/jre/lib/i386/libzip.so
40659000-41fe4000 r--s 00000000 03:07 588306 /usr/java/j2sdk1.4.2/jre/lib/rt.jar
4202e000-42044000 r--s 00000000 03:07 588277 /usr/java/j2sdk1.4.2/jre/lib/sunrsasign.jar
42044000-4211f000 r--s 00000000 03:07 588303 /usr/java/j2sdk1.4.2/jre/lib/jsse.jar
4211f000-42130000 r--s 00000000 03:07 588278 /usr/java/j2sdk1.4.2/jre/lib/jce.jar
42130000-42689000 r--s 00000000 03:07 588304 /usr/java/j2sdk1.4.2/jre/lib/charsets.jar
44731000-4473e000 r--s 00000000 03:07 881430 /usr/java/j2sdk1.4.2/jre/lib/ext/ldapsec.jar
4c7c0000-4c9c0000 r--p 00000000 03:07 196947 /usr/lib/locale/locale-archive
4c9c0000-4c9dc000 r--s 00000000 03:07 881427 /usr/java/j2sdk1.4.2/jre/lib/ext/sunjce_provider.jar
4c9dc000-4ca98000 r--s 00000000 03:07 881462 /usr/java/j2sdk1.4.2/jre/lib/ext/localedata.jar
Heap at VM Abort:
Heap
def new generation total 576K, used 497K [0x44740000, 0x447e0000, 0x44c20000)
eden space 512K, 97% used [0x44740000, 0x447bc498, 0x447c0000)
from space 64K, 0% used [0x447c0000, 0x447c0000, 0x447d0000)
to space 64K, 0% used [0x447d0000, 0x447d0000, 0x447e0000)
tenured generation total 1408K, used 0K [0x44c20000, 0x44d80000, 0x48740000)
the space 1408K, 0% used [0x44c20000, 0x44c20000, 0x44c20200, 0x44d80000)
compacting perm gen total 4096K, used 1154K [0x48740000, 0x48b40000, 0x4c740000)
the space 4096K, 28% used [0x48740000, 0x48860be8, 0x48860c00, 0x48b40000)
Local Time = Mon Feb 23 17:51:34 2004
Elapsed Time = 2
#
# HotSpot Virtual Machine Error : 11
# Error ID : 4F530E43505002EF
# Please report this error at
# http://java.sun.com/cgi-bin/bugreport.cgi
#
# Java VM: Java HotSpot(TM) Client VM (1.4.2-b28 mixed mode)
#
With 1.5.0 Beta 1:
of type class java.lang.Class
of type class java.lang.String
of type class [C
of type class [Ljava.io.ObjectStreamField;
of type class java.lang.String$CaseInsensitiveComparator
of type class java.lang.Class
of type class [Ljava.io.ObjectStreamField;
of type class sun.reflect.ReflectionFactory
of type class [Ljava.lang.annotation.Annotation;
of type class sun.reflect.UnsafeStaticObjectFieldAccessorImpl
#
# An unexpected error has been detected by HotSpot Virtual Machine:
#
# SIGSEGV (0xb) at pc=0x403473f8, pid=2783, tid=8192
#
# Java VM: Java HotSpot(TM) Client VM (1.5.0-beta-b32c mixed mode)
# Problematic frame:
# V [libjvm.so+0x2e43f8]
#
# An error report file with more information is saved as hs_err_pid2783.log
#
# If you would like to submit a bug report, please visit:
# http://java.sun.com/webapps/bugreport/crash.jsp
Source Code:
package Reflect;
// as is, it crashes
// uncomment line 111 to get a bizarre exception
// (object o seems to "become" null inside String.ValueOf)
// Replace the call to recAdd by iterAdd on line 81 to get the same kind of
// strange thing: ArrayStoreException in Vector.addElement!
import java.util.*;
import java.lang.reflect.*;
/** Explores a graph of instances. Given an object as a starting
* point, all instances reachable from this object are explored. This
* implementation can then provide a list of all the types encountered
* along with the number of occurrences in each type. Different
* graphs can be combined using the <code>add</code> method.
*
* @author Michel Charpentier
* @version 1.0, 02/24/04
* @see Class
* @see <a href="Tests.java">Tests.java</a>
*/
public class Instances {
/** Types are returned in an unspecified order.
*
* @see #iterator
*/
public static final int UNSORTED = 0;
/** Types are returned in alphabetical order of their fully qualified names.
*
* @see #iterator
*/
public static final int SORTED_BY_NAME = 1;
/** Types are returned in decreasing order of the number of
* occurrences in each type.
*
* @see #iterator
*/
public static final int SORTED_BY_OCCURRENCES = 2;
// Keys are type names, values are sets of instances
private final Map allInstances = new TreeMap();
// Wrapper around instances to make java.util stuff rely on ==
// instead of equals()
static private class Instance {
Object instance;
Instance (Object o) {
instance = o;
}
public boolean equals (Object o) {
return ((Instance)o).instance == this.instance;
}
public int hashCode () {
return instance.hashCode();
}
public String toString () { // for debugging purposes
return instance.toString();
}
}
/** Construct a new graph by adding instance <code>o</code> and
* all instances reachable from <code>o</code> to an empty graph. This
* constructor attempts to follow all data members regardless of their
* visibility.
*
* @param o initial instance
* @throws SecurityException if a security manager prevents
* the method from accessing some data member
* @see SecurityManager
*/
public Instances (Object o) throws SecurityException {
if (o == null)
throw new NullPointerException();
recAdd(o, -1);
}
/** Construct a new graph by adding instance <code>o</code> and
* all instances reachable from <code>o</code> within the given
* <code>depth</code> to an empty graph. A depth of 0 only adds object
* <code>o</code>; a depth of 1 adds all the fields of
* <code>o</code>. This constructor attempts to follow all data
* members regardless of their visibility.
*
* @param o initial instance
* @param depth depth of the exploration (maximum distance from
* origin <code>o</code>
* @throws IllegalArgumentException if <code>depth</code> is negative
* @throws SecurityException if a security manager prevents
* the method from accessing some data member
* @see SecurityManager
*/
public Instances (Object o, int depth) throws SecurityException {
if (o == null)
throw new NullPointerException();
if (depth < 0)
throw new IllegalArgumentException("depth cannot be negative.");
recAdd(o, depth+1);
}
// recursive solution
private void recAdd (Object o, int depth) {
if (o == null || depth == 0) return;
Class c = o.getClass();
//System.out.print("Found "+o);
System.out.println(" of type "+c);
String name = c.getName();
Set s = (Set)allInstances.get(name);
if (s == null) // first occurrence of this type
allInstances.put(name, s = new HashSet());
if (s.add(new Instance(o))) {
if (c.isArray() && !c.getComponentType().isPrimitive()) {
int l = Array.getLength(o);
for (int i=0; i<l; i++)
recAdd(Array.get(o, i), depth-1);
return; // is this safe?
}
do {
Field[] fields = c.getDeclaredFields();
AccessibleObject.setAccessible(fields, true);
for (int i=0; i<fields.length; i++) {
Field f = fields[i];
if (!f.getType().isPrimitive())
try {
recAdd(f.get(o), depth-1);
} catch (IllegalAccessException e) {
System.err.println
("Could not follow field "+f+" in "+c);
}
}
c = c.getSuperclass();
} while (c != null);
}
}
// iterative solution
private void iterAdd (Object start, int depth) {
Stack stack1 = new Stack();
stack1.push(start);
while (depth != 0) {
Stack stack2 = new Stack();
while (!stack1.isEmpty()) {
Object o = stack1.pop();
if (o == null) continue;
Class c = o.getClass();
String name = c.getName();
Set s = (Set)allInstances.get(name);
if (s == null) // first occurrence of this type
allInstances.put(name, s = new HashSet());
if (s.add(new Instance(o))) {
if (c.isArray() && !c.getComponentType().isPrimitive()) {
int l = Array.getLength(o);
for (int i=0; i<l; i++)
stack2.push(Array.get(o, i));
continue; // is it safe?
}
do {
Field[] fields = c.getDeclaredFields();
AccessibleObject.setAccessible(fields, true);
for (int i=0; i<fields.length; i++) {
Field f = fields[i];
if (!f.getType().isPrimitive())
try {
stack2.push(f.get(o));
} catch (IllegalAccessException e) {
System.err.println
("Could not follow field "+f+" in "+c);
}
}
c = c.getSuperclass();
} while (c != null);
}
}
if (stack2.isEmpty()) break;
stack1 = stack2;
depth--;
}
}
/** An iterator over all the class names found in the graph. Each call
* to <code>next()</code> returns a <code>String</code>. These
* strings are in no particular order, in alphabetical order, or
* in decreasing order of the number of occurrences of this type,
* depending on the value of <code>type</code>.
*
* @param type specifies the order of iteration
* @return an iterator of class names (as strings), in the specified order
* @see #UNSORTED
* @see #SORTED_BY_NAME
* @see #SORTED_BY_OCCURRENCES
*/
public Iterator iterator (int type) {
switch (type) {
case UNSORTED:
case SORTED_BY_NAME:
return new Itr(allInstances.entrySet());
case SORTED_BY_OCCURRENCES:
Vector v = new Vector(allInstances.entrySet());
Collections.sort(v, new Comparator() {
public int compare (Object o1, Object o2) {
- duplicates
-
JDK-5012260 ArrayStore exception in java.util.IdentityHashMap.put causes VM crash
- Closed
-
JDK-5018055 VM crashed accesing Field in sun.reflect.ConstantPool
- Closed
- relates to
-
JDK-5047224 (reflect) exception thrown from sun.reflect.Reflection.filterFields in Tiger b49
- Resolved
-
JDK-4479682 Program gets java.lang.NullPointerException, works with -classic mode
- Closed
-
JDK-5026972 (classes_lang) Clean up hiding of exception backtrace field
- Closed
-
JDK-5026971 (hotspot) Clean up hiding of exception backtrace field
- Closed
(1 relates to)