harmony-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Sergey Dmitriev (JIRA)" <j...@apache.org>
Subject [jira] Created: (HARMONY-4965) [drlvm][kernel] ClassLoader.findLoadedClass() does not cache not owned classes
Date Thu, 18 Oct 2007 08:30:50 GMT
[drlvm][kernel] ClassLoader.findLoadedClass() does not cache not owned classes
------------------------------------------------------------------------------

                 Key: HARMONY-4965
                 URL: https://issues.apache.org/jira/browse/HARMONY-4965
             Project: Harmony
          Issue Type: Bug
          Components: DRLVM
            Reporter: Sergey Dmitriev


I've found an issue with respect to class loading in Harmony. My measurements show that fixing
this can give a pretty big burst on SPECjAppServer2004 on Oracle App Server, approx 20% of
score.

The issue is quite simple: our classloader implementation does not support the caching of
classes that were loaded not by this classloader. It can be demonstrated:

{boy@moon:~/tmp} cat classloadertest.java
import java.io.*;

public class classloadertest {

    public static void main(String args[]) throws Exception {
        MyClassLoader mycl1 = new MyClassLoader("my", ClassLoader.getSystemClassLoader());
        MyClassLoader mycl2 = new MyClassLoader("my", mycl1);

        // load the hi.class with mycl1; so hi.class's class loader is 'mycl1'
        System.out.println("Class.forName(\"hi\", true, mycl1) = [" + Class.forName("hi",
true, mycl1) + "]");

        // load the hi.class with mycl2
        System.out.println("Class.forName(\"hi\", true, mycl2) = [" + Class.forName("hi",
true, mycl2) + "]");

        System.out.println("mycl1.findLoadedClass(hi) = [" + mycl1.findLoadedClassPublic("hi")
+ "]");
        System.out.println("mycl2.findLoadedClass(hi) = [" + mycl2.findLoadedClassPublic("hi")
+ "]");
    }

    // class loader which just loads from specified directory
    static class MyClassLoader extends ClassLoader {
        private String dir;
        public MyClassLoader(String dir, ClassLoader parent) {
            super(parent);
            this.dir = dir;
        }

        public Class findClass(String name) throws ClassNotFoundException {
            byte[] b = loadClassData(name);
            return defineClass(name, b, 0, b.length);
        }

        private byte[] loadClassData(String name) throws ClassNotFoundException {
            try {
                File file = new File(dir+"/"+name+".class");
                int length = (int) file.length();
                byte[] bytes = new byte[length];
                FileInputStream fis = new FileInputStream(file);
                for (int i=0; i<length; i++) {
                    int b = fis.read();
                    if (b == -1) {
                        throw new ClassFormatError(name);
                    } else {
                        bytes[i] = (byte) b;
                    }
                }
                if (fis.read() != -1) {
                    throw new ClassFormatError(name);
                }
                return bytes;
            } catch (FileNotFoundException e) {
                throw new ClassNotFoundException(name);
            } catch (IOException e) {
                System.out.println(e);
                return null;
            }
        }
        public Class findLoadedClassPublic(String name) {
            return super.findLoadedClass(name);
        }
    }
}

{boy@moon:~/tmp} cat my/hi.java 
import java.util.*;
public class hi {
    public static void main(String args[]) throws Exception {
        System.out.println("hi! from "+System.getProperty("java.vm.vendor"));
    }
}

{boy@moon:~/tmp} /export/jdk1.6.0/bin/java classloadertest
Class.forName("hi", true, mycl1) = [class hi]
Class.forName("hi", true, mycl2) = [class hi]
mycl1.findLoadedClass(hi) = [class hi]
mycl2.findLoadedClass(hi) = [class hi]

{boy@moon:~/tmp} ~/harmony579850/bin/java classloadertest
Class.forName("hi", true, mycl1) = [class hi]
Class.forName("hi", true, mycl2) = [class hi]
mycl1.findLoadedClass(hi) = [class hi]
mycl2.findLoadedClass(hi) = [null]

{boy@moon:~/tmp} 

Please note the "mycl2.findLoadedClass(hi) = ..." lines in outputs.


-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


Mime
View raw message