# HG changeset patch # User malenkov # Date 1265355372 -10800 # Node ID 4f7de5eeeac72fce41f3c74bc9a6dd21beb34756 # Parent 37c9fe9cc3975ece60fa7f766127a929198033c4 6921057: REGRESSION: persistence delegate issue on Windows and Linux against 5.u23b03/6u17b11 Reviewed-by: peterz, art diff -r 37c9fe9cc397 -r 4f7de5eeeac7 jdk/src/share/classes/java/beans/Introspector.java --- a/jdk/src/share/classes/java/beans/Introspector.java Thu Jan 28 16:12:06 2010 -0800 +++ b/jdk/src/share/classes/java/beans/Introspector.java Fri Feb 05 10:36:12 2010 +0300 @@ -1,5 +1,5 @@ /* - * Copyright 1996-2009 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1996-2010 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -29,6 +29,8 @@ import com.sun.beans.finder.BeanInfoFinder; import com.sun.beans.finder.ClassFinder; +import java.lang.ref.Reference; +import java.lang.ref.SoftReference; import java.lang.reflect.Method; import java.lang.reflect.Modifier; @@ -39,6 +41,7 @@ import java.util.EventListener; import java.util.List; import java.util.TreeMap; +import java.util.WeakHashMap; import sun.awt.AppContext; import sun.reflect.misc.ReflectUtil; @@ -155,11 +158,11 @@ return (new Introspector(beanClass, null, USE_ALL_BEANINFO)).getBeanInfo(); } synchronized (BEANINFO_CACHE) { - WeakCache, BeanInfo> beanInfoCache = - (WeakCache, BeanInfo>) AppContext.getAppContext().get(BEANINFO_CACHE); + Map, BeanInfo> beanInfoCache = + (Map, BeanInfo>) AppContext.getAppContext().get(BEANINFO_CACHE); if (beanInfoCache == null) { - beanInfoCache = new WeakCache, BeanInfo>(); + beanInfoCache = new WeakHashMap, BeanInfo>(); AppContext.getAppContext().put(BEANINFO_CACHE, beanInfoCache); } BeanInfo beanInfo = beanInfoCache.get(beanClass); @@ -341,7 +344,7 @@ public static void flushCaches() { synchronized (BEANINFO_CACHE) { - WeakCache beanInfoCache = (WeakCache) AppContext.getAppContext().get(BEANINFO_CACHE); + Map beanInfoCache = (Map) AppContext.getAppContext().get(BEANINFO_CACHE); if (beanInfoCache != null) { beanInfoCache.clear(); } @@ -369,7 +372,7 @@ throw new NullPointerException(); } synchronized (BEANINFO_CACHE) { - WeakCache beanInfoCache = (WeakCache) AppContext.getAppContext().get(BEANINFO_CACHE); + Map beanInfoCache = (Map) AppContext.getAppContext().get(BEANINFO_CACHE); if (beanInfoCache != null) { beanInfoCache.put(clz, null); } @@ -1458,7 +1461,7 @@ private PropertyDescriptor[] properties; private int defaultProperty; private MethodDescriptor[] methods; - private BeanInfo targetBeanInfo; + private final Reference targetBeanInfoRef; public GenericBeanInfo(BeanDescriptor beanDescriptor, EventSetDescriptor[] events, int defaultEvent, @@ -1470,7 +1473,7 @@ this.properties = properties; this.defaultProperty = defaultProperty; this.methods = methods; - this.targetBeanInfo = targetBeanInfo; + this.targetBeanInfoRef = new SoftReference(targetBeanInfo); } /** @@ -1509,7 +1512,7 @@ methods[i] = new MethodDescriptor(old.methods[i]); } } - targetBeanInfo = old.targetBeanInfo; + this.targetBeanInfoRef = old.targetBeanInfoRef; } public PropertyDescriptor[] getPropertyDescriptors() { @@ -1537,6 +1540,7 @@ } public java.awt.Image getIcon(int iconKind) { + BeanInfo targetBeanInfo = this.targetBeanInfoRef.get(); if (targetBeanInfo != null) { return targetBeanInfo.getIcon(iconKind); } diff -r 37c9fe9cc397 -r 4f7de5eeeac7 jdk/test/java/beans/Introspector/6380849/TestBeanInfo.java --- a/jdk/test/java/beans/Introspector/6380849/TestBeanInfo.java Thu Jan 28 16:12:06 2010 -0800 +++ b/jdk/test/java/beans/Introspector/6380849/TestBeanInfo.java Fri Feb 05 10:36:12 2010 +0300 @@ -1,5 +1,5 @@ /** - * Copyright 2009 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2010 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -38,6 +38,7 @@ import java.beans.BeanInfo; import java.beans.Introspector; +import java.lang.ref.Reference; import java.lang.reflect.Field; import sun.awt.SunToolkit; @@ -61,9 +62,10 @@ try { actual = Introspector.getBeanInfo(type); type = actual.getClass(); - Field field = type.getDeclaredField("targetBeanInfo"); // NON-NLS: field name + Field field = type.getDeclaredField("targetBeanInfoRef"); // NON-NLS: field name field.setAccessible(true); - actual = (BeanInfo) field.get(actual); + Reference ref = (Reference) field.get(actual); + actual = (BeanInfo) ref.get(); } catch (Exception exception) { throw new Error("unexpected error", exception); diff -r 37c9fe9cc397 -r 4f7de5eeeac7 jdk/test/java/beans/Introspector/Test5102804.java --- a/jdk/test/java/beans/Introspector/Test5102804.java Thu Jan 28 16:12:06 2010 -0800 +++ b/jdk/test/java/beans/Introspector/Test5102804.java Fri Feb 05 10:36:12 2010 +0300 @@ -1,5 +1,5 @@ /* - * Copyright 2009 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2010 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -24,9 +24,9 @@ /* * @test * @bug 5102804 - * @ignore This test is not predictable with regards to GC * @summary Tests memory leak * @author Sergey Malenkov + * @run main/othervm -ms16m -mx16m Test5102804 */ import java.beans.BeanInfo; diff -r 37c9fe9cc397 -r 4f7de5eeeac7 jdk/test/java/beans/XMLEncoder/Test4646747.java --- a/jdk/test/java/beans/XMLEncoder/Test4646747.java Thu Jan 28 16:12:06 2010 -0800 +++ b/jdk/test/java/beans/XMLEncoder/Test4646747.java Fri Feb 05 10:36:12 2010 +0300 @@ -1,5 +1,5 @@ /* - * Copyright 2004-2007 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2004-2010 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,6 +26,7 @@ * @bug 4646747 * @summary Tests that persistence delegate is correct after memory stress * @author Mark Davidson + * @run main/othervm -ms16m -mx16m Test4646747 */ import java.beans.DefaultPersistenceDelegate; @@ -41,11 +42,14 @@ encoder.setPersistenceDelegate(Test4646747.class, new MyPersistenceDelegate()); // WARNING: This can eat up a lot of memory Object[] obs = new Object[10000]; - for (int i = 0; i < obs.length; i++) { - obs[i] = new int[1000]; + while (obs != null) { + try { + obs = new Object[obs.length + obs.length / 3]; + } + catch (OutOfMemoryError error) { + obs = null; + } } - System.gc(); - System.gc(); PersistenceDelegate pd = encoder.getPersistenceDelegate(Test4646747.class); if (!(pd instanceof MyPersistenceDelegate)) throw new Error("persistence delegate has been lost");