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.