Return-Path: Delivered-To: apmail-harmony-commits-archive@www.apache.org Received: (qmail 52887 invoked from network); 23 Oct 2007 07:46:42 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.2) by minotaur.apache.org with SMTP; 23 Oct 2007 07:46:42 -0000 Received: (qmail 96459 invoked by uid 500); 23 Oct 2007 07:46:29 -0000 Delivered-To: apmail-harmony-commits-archive@harmony.apache.org Received: (qmail 96444 invoked by uid 500); 23 Oct 2007 07:46:29 -0000 Mailing-List: contact commits-help@harmony.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@harmony.apache.org Delivered-To: mailing list commits@harmony.apache.org Received: (qmail 96435 invoked by uid 99); 23 Oct 2007 07:46:29 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 23 Oct 2007 00:46:29 -0700 X-ASF-Spam-Status: No, hits=-100.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO brutus.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 23 Oct 2007 07:46:41 +0000 Received: from brutus (localhost [127.0.0.1]) by brutus.apache.org (Postfix) with ESMTP id AB6C17141EB for ; Tue, 23 Oct 2007 00:45:50 -0700 (PDT) Message-ID: <23106590.1193125550688.JavaMail.jira@brutus> Date: Tue, 23 Oct 2007 00:45:50 -0700 (PDT) From: "Regis Xu (JIRA)" To: commits@harmony.apache.org Subject: [jira] Commented: (HARMONY-4942) [classlib][jndi] InitialContext searches for jndi.properties every contruction time In-Reply-To: <17806745.1192276130594.JavaMail.jira@brutus> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-Virus-Checked: Checked by ClamAV on apache.org [ https://issues.apache.org/jira/browse/HARMONY-4942?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_12536938 ] Regis Xu commented on HARMONY-4942: ----------------------------------- Sergey, I test Harmony-4942.new.diff using your test case on my machine, the performance is still low than ri but have great improvement. the output is: on ri: 20000 constructor calls (default) 1. 167 millis 2. 81 millis 3. 82 millis 4. 85 millis 5. 86 millis 6. 83 millis 7. 82 millis 8. 86 millis on harmony: 20000 constructor calls (default) 1. 653 millis 2. 339 millis 3. 316 millis 4. 324 millis 5. 317 millis 6. 324 millis 7. 329 millis 8. 333 millis In this case, all properties files will be read only once. And because there is only one classloader, CLASSPATH will search once, i think there would be another bottleneck somewhere, i will try to find it. > [classlib][jndi] InitialContext searches for jndi.properties every contruction time > ----------------------------------------------------------------------------------- > > Key: HARMONY-4942 > URL: https://issues.apache.org/jira/browse/HARMONY-4942 > Project: Harmony > Issue Type: Bug > Components: Classlib > Reporter: Sergey Dmitriev > Assignee: Tony Wu > Attachments: Harmony-4942.diff, Harmony-4942.new.diff, Harmony-4942.new.diff, jndi3.java, jndi3_POC.patch, jndi3perf.java, MyDefaultInitialContextFactory.java, MyInitialContext.java > > > I'd like to bring attention of JNDI guys to the following issue. > This is about InitialContext. Currently the InitialContext constructor implementation roughly speaking does the following: > 1. gets the properties passed to constructor (if any) > 2. searches the system properties for corresponding to JNDI stuff > 3. searches for jndi.properties in CLASSPATH and gets the properties from that (if any) > (in case of InitialContext() we don't have the first step) > This is quite cool until we face big amount of InitialContext() creations - then we see a lot of file system operations from step 3. For example during the Oracle App Server startup (with SPECjAppServer2004 onboard) - there is a lot of "new InitialContext()", every Bean creation. So we see about 27 millions of searches for "jndi.properties" in jar files from the Oracle App Server classpath (tens of jars). > Is there anything can be done on this?.. > Well as it turned out the JDK1.6.0 DOES NOT searches for the "jndi.properties" in CLASSPATH for the second time we create InitialContext(). Once it's loaded the "jndi.properties" properties for the first time it does not bother to do it later. I suggest to do the same in harmony. Here is the output of the test demonstrating such a behaviour difference: > {man@earth:~/tmp} cat jndi3.java > import java.io.*; > import javax.naming.*; > public class jndi3 { > public static void main(String args[]) throws Exception { > createJndiPropertiesFile(); // create valid jndi.properties > InitialContext context1 = new InitialContext(); > System.out.println("context1= "+context1); > System.out.println("context1.env="+context1.getEnvironment()); > deleteJndiPropertiesFile(); // delete jndi.properties > InitialContext context2 = new InitialContext(); > System.out.println("context2= "+context2); > System.out.println("context2.env="+context2.getEnvironment()); > } > public static void createJndiPropertiesFile() throws Exception { > FileOutputStream fos = new FileOutputStream("jndi.properties"); > PrintStream ps = new PrintStream(fos); > ps.println("java.naming.factory.initial=MyDefaultInitialContextFactory"); > ps.close(); > } > public static void deleteJndiPropertiesFile() throws Exception { > File f = new File("jndi.properties"); > f.delete(); > } > } > {man@earth:~/tmp} /export/jdk1.6.0/bin/java jndi3 > context1= javax.naming.InitialContext@1034bb5 > context1.env={} > context2= javax.naming.InitialContext@15f5897 > context2.env={} > {man@earth:~/tmp} ~/harmony579850.clean/bin/java jndi3 > context1= javax.naming.InitialContext@108d9d1f > context1.env={} > context2= javax.naming.InitialContext@109242b5 > Uncaught exception in main: > javax.naming.NoInitialContextException: Failed to create InitialContext using factory specified in hashtable {} [Root exception is java.lang.NullPointerException] > at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:239) > at javax.naming.InitialContext.initializeDefaultInitCtx(InitialContext.java:261) > at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:291) > at javax.naming.InitialContext.getEnvironment(InitialContext.java:540) > at jndi3.main(jndi3.java:17) > Caused by: java.lang.NullPointerException > at java.lang.Class.forName(Unknown Source) > at javax.naming.spi.NamingManager$1.run(NamingManager.java:772) > at javax.naming.spi.NamingManager$1.run(NamingManager.java:1) > at java.security.AccessController.doPrivilegedImpl(Unknown Source) > at java.security.AccessController.doPrivileged(Unknown Source) > at javax.naming.spi.NamingManager.classForName(NamingManager.java:768) > at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:227) > at javax.naming.InitialContext.initializeDefaultInitCtx(InitialContext.java:261) > ... 3 more > I've created a simple proof-of-concept of my idea: what about to not to do any of steps (1, 2, 3) not just 3? So please note that THIS IS NOT THE FIX! The actual fix should avoid only step 3 and probably should do it more carefully. Here are some measurements with respect to this (see jndi3per.java in attachment): > {man@earth:~/tmp} ~/harmony579850.clean/bin/java jndi3perf 20000 > 20000 constructor calls > 1. 17442 millis > 2. 11281 millis > 3. 11598 millis > 4. 10951 millis > 5. 10906 millis > ^C > {man@earth:~/tmp} ~/harmony579850.jndi3/bin/java jndi3perf 20000 > 20000 constructor calls > 1. 466 millis > 2. 114 millis > 3. 107 millis > 4. 110 millis > 5. 107 millis > ^C > Talking back about Oracle App Server and SPECjAppServer2004: startup times burst comparing harmony without and with the proposed patch are: > -Xem:client - 4X > -Xem:server - 2x > Furthermore SPECjAppServer2004 execution period is concerned to this as well: as it turned out we have ABOUT 3000 OF LOOKUPS of "jndi.properties" in jar files PER SECOND (transaction rate is about two hundreds). I'd say handling this should not decrease our current scores on SjAS2004. -- This message is automatically generated by JIRA. - You can reply to this email to add a comment to the issue online.