You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by "Gregory Shimansky (JIRA)" <ji...@apache.org> on 2007/12/28 15:06:44 UTC

[jira] Closed: (HARMONY-4965) [drlvm][kernel] ClassLoader.findLoadedClass() does not cache not owned classes

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

Gregory Shimansky closed HARMONY-4965.
--------------------------------------


No response, assuming ok.

> [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
>            Assignee: Gregory Shimansky
>         Attachments: classloadertest2.java, H4965.patch, 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.