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] Commented: (HARMONY-4965) [drlvm][kernel] ClassLoader.findLoadedClass() does not cache not owned classes
Date Tue, 30 Oct 2007 13:30:53 GMT

    [ https://issues.apache.org/jira/browse/HARMONY-4965?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_12538773
] 

Sergey Dmitriev commented on HARMONY-4965:
------------------------------------------

Guys I have something with respect to "bug || imporovement" - what about his quote:

protected final Class<?> findLoadedClass(String name)
    Returns the class with the given binary name if this loader has been recorded by the Java
virtual
    machine as an initiating loader of a class with that binary name. Otherwise null is returned.

Here what I see in Harmony behaviour (classloader3.java == classloader2.java + very slightly
changed main()):

{neo@xeon:~/test/clcache} cat classloadertest3.java 
import java.io.*;

public class classloadertest3 {

    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 mycl2
        System.out.println("Class.forName(\"hi\", true, mycl2) = [" + Class.forName("hi",
true, mycl2) + "]");

        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);
        }
    }
} 

{neo@xeon:~/test/clcache} ~/harmony.22oct.jndiprops/bin/java classloadertest3
Class.forName("hi", true, mycl2) = [class hi]
mycl2.findLoadedClass(hi) = [null]

{neo@xeon:~/test/clcache} java classloadertest3
Class.forName("hi", true, mycl2) = [class hi]
mycl2.findLoadedClass(hi) = [class hi]


> [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: Improvement
>          Components: DRLVM
>            Reporter: Sergey Dmitriev
>         Attachments: classloadertest2.java, test.java
>
>
> 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