Author: markt Date: Wed Jan 25 20:07:58 2017 New Revision: 1780263 URL: http://svn.apache.org/viewvc?rev=1780263&view=rev Log: Reduce the contention in the default InstanceManager implementation when multiple threads are managing objects and need to reference the annotation cache. Prior to this patch, TestDefaultInstanceManager#testConcurrency() showed a roughly linear increase in execution time as the thread count increased. With this patch applied, the test shows broadly no change in execution time as the thread count is increased from 1 to 8 on a machine with 8 cores available.
Modified: tomcat/tc8.5.x/trunk/ (props changed) tomcat/tc8.5.x/trunk/java/org/apache/catalina/core/DefaultInstanceManager.java tomcat/tc8.5.x/trunk/java/org/apache/catalina/core/LocalStrings.properties tomcat/tc8.5.x/trunk/java/org/apache/catalina/core/StandardContext.java tomcat/tc8.5.x/trunk/java/org/apache/tomcat/InstanceManager.java tomcat/tc8.5.x/trunk/test/org/apache/catalina/core/TestDefaultInstanceManager.java tomcat/tc8.5.x/trunk/webapps/docs/changelog.xml Propchange: tomcat/tc8.5.x/trunk/ ------------------------------------------------------------------------------ --- svn:mergeinfo (original) +++ svn:mergeinfo Wed Jan 25 20:07:58 2017 @@ -1 +1 @@ -/tomcat/trunk:1734785,1734799,1734845,1734928,1735041,1735044,1735480,1735577,1735597,1735599-1735600,1735615,1736145,1736162,1736209,1736280,1736297,1736299,1736489,1736646,1736703,1736836,1736849,1737104-1737105,1737112,1737117,1737119-1737120,1737155,1737157,1737192,1737280,1737339,1737632,1737664,1737715,1737748,1737785,1737834,1737860,1737903,1737959,1738005,1738007,1738014-1738015,1738018,1738022,1738039,1738043,1738059-1738060,1738147,1738149,1738174-1738175,1738261,1738589,1738623-1738625,1738643,1738816,1738850,1738855,1738946-1738948,1738953-1738954,1738979,1738982,1739079-1739081,1739087,1739113,1739153,1739172,1739176,1739191,1739474,1739726,1739762,1739775,1739814,1739817-1739818,1739975,1740131,1740324,1740465,1740495,1740508-1740509,1740520,1740535,1740707,1740803,1740810,1740969,1740980,1740991,1740997,1741015,1741033,1741036,1741058,1741060,1741080,1741147,1741159,1741164,1741173,1741181,1741190,1741197,1741202,1741208,1741213,1741221,1741225,1741232,1741409,1741501 ,1741677,1741892,1741896,1741984,1742023,1742042,1742071,1742090,1742093,1742101,1742105,1742111,1742139,1742146,1742148,1742166,1742181,1742184,1742187,1742246,1742248-1742251,1742263-1742264,1742268,1742276,1742369,1742387,1742448,1742509-1742512,1742917,1742919,1742933,1742975-1742976,1742984,1742986,1743019,1743115,1743117,1743124-1743125,1743134,1743425,1743554,1743679,1743696-1743698,1743700-1743701,1744058,1744064-1744065,1744125,1744194,1744229,1744270,1744323,1744432,1744684,1744697,1744705,1744713,1744760,1744786,1745083,1745142-1745143,1745145,1745177,1745179-1745180,1745227,1745248,1745254,1745337,1745467,1745473,1745576,1745735,1745744,1746304,1746306-1746307,1746319,1746327,1746338,1746340-1746341,1746344,1746427,1746441,1746473,1746490,1746492,1746495-1746496,1746499-1746501,1746503-1746507,1746509,1746549,1746551,1746554,1746556,1746558,1746584,1746620,1746649,1746724,1746939,1746989,1747014,1747028,1747035,1747210,1747225,1747234,1747253,1747404,1747506,1747536,1747 924,1747980,1747993,1748001,1748253,1748452,1748547,1748629,1748676,1748715,1749287,1749296,1749328,1749373,1749465,1749506,1749508,1749665-1749666,1749763,1749865-1749866,1749898,1749978,1749980,1750011,1750015,1750056,1750480,1750617,1750634,1750692,1750697,1750700,1750703,1750707,1750714,1750718,1750723,1750774,1750899,1750975,1750995,1751061,1751097,1751173,1751438,1751447,1751463,1751702,1752212,1752737,1752745,1753078,1753080,1753358,1753363,1754111,1754140-1754141,1754281,1754310,1754445,1754467,1754494,1754496,1754528,1754532-1754533,1754613,1754714,1754874,1754941,1754944,1754950-1754951,1755005,1755007,1755009,1755132,1755180-1755181,1755185,1755190,1755204-1755206,1755208,1755214,1755224,1755227,1755230,1755629,1755646-1755647,1755650,1755653,1755675,1755680,1755683,1755693,1755717,1755731-1755737,1755812,1755828,1755884,1755890,1755918-1755919,1755942,1755958,1755960,1755970,1755993,1756013,1756019,1756039,1756056,1756083-1756114,1756175,1756288-1756289,1756408-1756410,1 756778,1756798,1756878,1756898,1756939,1757123-1757124,1757126,1757128,1757132-1757133,1757136,1757145,1757167-1757168,1757175,1757180,1757182,1757195,1757271,1757278,1757347,1757353-1757354,1757363,1757374,1757399,1757406,1757408,1757485,1757495,1757499,1757527,1757578,1757684,1757722,1757727,1757790,1757799,1757813,1757853,1757883,1757903,1757976,1757997,1758000,1758058,1758072-1758075,1758078-1758079,1758223,1758257,1758261,1758276,1758292,1758369,1758378-1758383,1758421,1758423,1758425-1758427,1758430,1758443,1758448,1758459,1758483,1758486-1758487,1758499,1758525,1758556,1758580,1758582,1758584,1758588,1758842,1759019,1759212,1759224,1759227,1759252,1759274,1759513-1759516,1759611,1759757,1759785-1759790,1760005,1760022,1760109-1760110,1760135,1760200-1760201,1760227,1760300,1760397,1760446,1760454,1760640,1760648,1761057,1761422,1761491,1761498,1761500-1761501,1761550,1761553,1761572,1761574,1761625-1761626,1761628,1761682,1761740,1761752,1762051-1762053,1762123,1762168,176217 2,1762182,1762201-1762202,1762204,1762208,1762288,1762296,1762324,1762348,1762353,1762362,1762374,1762492,1762503,1762505,1762541,1762608,1762710,1762753,1762766,1762769,1762944,1762947,1762953,1763167,1763179,1763232,1763259,1763271-1763272,1763276-1763277,1763319-1763320,1763370,1763372,1763375,1763377,1763393,1763412,1763430,1763450,1763462,1763505,1763511-1763512,1763516,1763518,1763520,1763529,1763559,1763565,1763568,1763574,1763619,1763634-1763635,1763718,1763786,1763798-1763799,1763813,1763815,1763819,1763831,1764083,1764425,1764646,1764648-1764649,1764659,1764663,1764682,1764862,1764866-1764867,1764870,1764897,1765133,1765299,1765358,1765439,1765447,1765495,1765502,1765569-1765571,1765579,1765582,1765589-1765590,1765794,1765801,1765813,1765815,1766276,1766514,1766533,1766535,1766664,1766675,1766698,1766700,1766822,1767047,1767328,1767362,1767368,1767429,1767471,1767505,1767641-1767644,1767903,1767945-1767946,1768123,1768283,1768520,1768569,1768651,1768762,1768922,1769191,176 9263,1769630,1769833,1769975,1770047,1770140,1770180,1770258,1770389,1770656,1770666,1770718,1770762,1770952,1770954,1770956,1770961,1771087,1771126,1771139,1771143,1771149,1771156,1771266,1771316,1771386,1771611,1771613,1771711,1771718,1771723-1771724,1771730,1771743,1771752,1771853,1771963,1772170,1772174,1772223,1772229,1772318-1772319,1772353,1772355,1772554,1772603-1772609,1772849,1772865,1772870,1772872,1772875-1772876,1772881,1772886,1772947,1773306,1773344,1773418,1773756,1773813-1773814,1774052,1774102,1774131,1774161,1774164,1774248,1774253,1774257,1774259,1774262,1774267,1774271,1774303,1774340,1774406,1774412,1774426,1774433,1774522-1774523,1774526,1774528-1774529,1774531,1774732-1774736,1774738-1774739,1774741-1774742,1774749,1774755,1774789,1774858,1774867,1775596,1775985-1775986,1776540,1776937,1776954,1777011,1777173,1777189,1777211,1777546,1777605,1777619,1777647,1777721-1777722,1777967,1778061,1778138-1778139,1778141-1778150,1778154,1778275-1778276,1778295,1778342, 1778348,1778404,1778424,1778426,1778582,1778600,1779641,1779654,1779708,1779718,1779897,1779899,1780109 +/tomcat/trunk:1734785,1734799,1734845,1734928,1735041,1735044,1735480,1735577,1735597,1735599-1735600,1735615,1736145,1736162,1736209,1736280,1736297,1736299,1736489,1736646,1736703,1736836,1736849,1737104-1737105,1737112,1737117,1737119-1737120,1737155,1737157,1737192,1737280,1737339,1737632,1737664,1737715,1737748,1737785,1737834,1737860,1737903,1737959,1738005,1738007,1738014-1738015,1738018,1738022,1738039,1738043,1738059-1738060,1738147,1738149,1738174-1738175,1738261,1738589,1738623-1738625,1738643,1738816,1738850,1738855,1738946-1738948,1738953-1738954,1738979,1738982,1739079-1739081,1739087,1739113,1739153,1739172,1739176,1739191,1739474,1739726,1739762,1739775,1739814,1739817-1739818,1739975,1740131,1740324,1740465,1740495,1740508-1740509,1740520,1740535,1740707,1740803,1740810,1740969,1740980,1740991,1740997,1741015,1741033,1741036,1741058,1741060,1741080,1741147,1741159,1741164,1741173,1741181,1741190,1741197,1741202,1741208,1741213,1741221,1741225,1741232,1741409,1741501 ,1741677,1741892,1741896,1741984,1742023,1742042,1742071,1742090,1742093,1742101,1742105,1742111,1742139,1742146,1742148,1742166,1742181,1742184,1742187,1742246,1742248-1742251,1742263-1742264,1742268,1742276,1742369,1742387,1742448,1742509-1742512,1742917,1742919,1742933,1742975-1742976,1742984,1742986,1743019,1743115,1743117,1743124-1743125,1743134,1743425,1743554,1743679,1743696-1743698,1743700-1743701,1744058,1744064-1744065,1744125,1744194,1744229,1744270,1744323,1744432,1744684,1744697,1744705,1744713,1744760,1744786,1745083,1745142-1745143,1745145,1745177,1745179-1745180,1745227,1745248,1745254,1745337,1745467,1745473,1745576,1745735,1745744,1746304,1746306-1746307,1746319,1746327,1746338,1746340-1746341,1746344,1746427,1746441,1746473,1746490,1746492,1746495-1746496,1746499-1746501,1746503-1746507,1746509,1746549,1746551,1746554,1746556,1746558,1746584,1746620,1746649,1746724,1746939,1746989,1747014,1747028,1747035,1747210,1747225,1747234,1747253,1747404,1747506,1747536,1747 924,1747980,1747993,1748001,1748253,1748452,1748547,1748629,1748676,1748715,1749287,1749296,1749328,1749373,1749465,1749506,1749508,1749665-1749666,1749763,1749865-1749866,1749898,1749978,1749980,1750011,1750015,1750056,1750480,1750617,1750634,1750692,1750697,1750700,1750703,1750707,1750714,1750718,1750723,1750774,1750899,1750975,1750995,1751061,1751097,1751173,1751438,1751447,1751463,1751702,1752212,1752737,1752745,1753078,1753080,1753358,1753363,1754111,1754140-1754141,1754281,1754310,1754445,1754467,1754494,1754496,1754528,1754532-1754533,1754613,1754714,1754874,1754941,1754944,1754950-1754951,1755005,1755007,1755009,1755132,1755180-1755181,1755185,1755190,1755204-1755206,1755208,1755214,1755224,1755227,1755230,1755629,1755646-1755647,1755650,1755653,1755675,1755680,1755683,1755693,1755717,1755731-1755737,1755812,1755828,1755884,1755890,1755918-1755919,1755942,1755958,1755960,1755970,1755993,1756013,1756019,1756039,1756056,1756083-1756114,1756175,1756288-1756289,1756408-1756410,1 756778,1756798,1756878,1756898,1756939,1757123-1757124,1757126,1757128,1757132-1757133,1757136,1757145,1757167-1757168,1757175,1757180,1757182,1757195,1757271,1757278,1757347,1757353-1757354,1757363,1757374,1757399,1757406,1757408,1757485,1757495,1757499,1757527,1757578,1757684,1757722,1757727,1757790,1757799,1757813,1757853,1757883,1757903,1757976,1757997,1758000,1758058,1758072-1758075,1758078-1758079,1758223,1758257,1758261,1758276,1758292,1758369,1758378-1758383,1758421,1758423,1758425-1758427,1758430,1758443,1758448,1758459,1758483,1758486-1758487,1758499,1758525,1758556,1758580,1758582,1758584,1758588,1758842,1759019,1759212,1759224,1759227,1759252,1759274,1759513-1759516,1759611,1759757,1759785-1759790,1760005,1760022,1760109-1760110,1760135,1760200-1760201,1760227,1760300,1760397,1760446,1760454,1760640,1760648,1761057,1761422,1761491,1761498,1761500-1761501,1761550,1761553,1761572,1761574,1761625-1761626,1761628,1761682,1761740,1761752,1762051-1762053,1762123,1762168,176217 2,1762182,1762201-1762202,1762204,1762208,1762288,1762296,1762324,1762348,1762353,1762362,1762374,1762492,1762503,1762505,1762541,1762608,1762710,1762753,1762766,1762769,1762944,1762947,1762953,1763167,1763179,1763232,1763259,1763271-1763272,1763276-1763277,1763319-1763320,1763370,1763372,1763375,1763377,1763393,1763412,1763430,1763450,1763462,1763505,1763511-1763512,1763516,1763518,1763520,1763529,1763559,1763565,1763568,1763574,1763619,1763634-1763635,1763718,1763786,1763798-1763799,1763813,1763815,1763819,1763831,1764083,1764425,1764646,1764648-1764649,1764659,1764663,1764682,1764862,1764866-1764867,1764870,1764897,1765133,1765299,1765358,1765439,1765447,1765495,1765502,1765569-1765571,1765579,1765582,1765589-1765590,1765794,1765801,1765813,1765815,1766276,1766514,1766533,1766535,1766664,1766675,1766698,1766700,1766822,1767047,1767328,1767362,1767368,1767429,1767471,1767505,1767641-1767644,1767903,1767945-1767946,1768123,1768283,1768520,1768569,1768651,1768762,1768922,1769191,176 9263,1769630,1769833,1769975,1770047,1770140,1770180,1770258,1770389,1770656,1770666,1770718,1770762,1770952,1770954,1770956,1770961,1771087,1771126,1771139,1771143,1771149,1771156,1771266,1771316,1771386,1771611,1771613,1771711,1771718,1771723-1771724,1771730,1771743,1771752,1771853,1771963,1772170,1772174,1772223,1772229,1772318-1772319,1772353,1772355,1772554,1772603-1772609,1772849,1772865,1772870,1772872,1772875-1772876,1772881,1772886,1772947,1773306,1773344,1773418,1773756,1773813-1773814,1774052,1774102,1774131,1774161,1774164,1774248,1774253,1774257,1774259,1774262,1774267,1774271,1774303,1774340,1774406,1774412,1774426,1774433,1774522-1774523,1774526,1774528-1774529,1774531,1774732-1774736,1774738-1774739,1774741-1774742,1774749,1774755,1774789,1774858,1774867,1775596,1775985-1775986,1776540,1776937,1776954,1777011,1777173,1777189,1777211,1777546,1777605,1777619,1777647,1777721-1777722,1777967,1778061,1778138-1778139,1778141-1778150,1778154,1778275-1778276,1778295,1778342, 1778348,1778404,1778424,1778426,1778582,1778600,1779641,1779654,1779708,1779718,1779897,1779899,1780109,1780120,1780189,1780196 Modified: tomcat/tc8.5.x/trunk/java/org/apache/catalina/core/DefaultInstanceManager.java URL: http://svn.apache.org/viewvc/tomcat/tc8.5.x/trunk/java/org/apache/catalina/core/DefaultInstanceManager.java?rev=1780263&r1=1780262&r2=1780263&view=diff ============================================================================== --- tomcat/tc8.5.x/trunk/java/org/apache/catalina/core/DefaultInstanceManager.java (original) +++ tomcat/tc8.5.x/trunk/java/org/apache/catalina/core/DefaultInstanceManager.java Wed Jan 25 20:07:58 2017 @@ -34,7 +34,6 @@ import java.util.List; import java.util.Map; import java.util.Properties; import java.util.Set; -import java.util.WeakHashMap; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; @@ -53,6 +52,7 @@ import org.apache.catalina.util.Introspe import org.apache.juli.logging.Log; import org.apache.tomcat.InstanceManager; import org.apache.tomcat.util.ExceptionUtils; +import org.apache.tomcat.util.collections.ManagedConcurrentWeakHashMap; import org.apache.tomcat.util.res.StringManager; public class DefaultInstanceManager implements InstanceManager { @@ -74,8 +74,8 @@ public class DefaultInstanceManager impl protected final boolean privileged; protected final boolean ignoreAnnotations; private final Set<String> restrictedClasses; - private final Map<Class<?>, AnnotationCacheEntry[]> annotationCache = - new WeakHashMap<>(); + private final ManagedConcurrentWeakHashMap<Class<?>, AnnotationCacheEntry[]> annotationCache = + new ManagedConcurrentWeakHashMap<>(); private final Map<String, String> postConstructMethods; private final Map<String, String> preDestroyMethods; @@ -190,10 +190,7 @@ public class DefaultInstanceManager impl // At the end the postconstruct annotated // method is invoked - AnnotationCacheEntry[] annotations; - synchronized (annotationCache) { - annotations = annotationCache.get(clazz); - } + AnnotationCacheEntry[] annotations = annotationCache.get(clazz); for (AnnotationCacheEntry entry : annotations) { if (entry.getType() == AnnotationCacheEntryType.POST_CONSTRUCT) { Method postConstruct = getMethod(clazz, entry); @@ -227,10 +224,7 @@ public class DefaultInstanceManager impl // At the end the postconstruct annotated // method is invoked - AnnotationCacheEntry[] annotations = null; - synchronized (annotationCache) { - annotations = annotationCache.get(clazz); - } + AnnotationCacheEntry[] annotations = annotationCache.get(clazz); if (annotations == null) { // instance not created through the instance manager return; @@ -249,6 +243,12 @@ public class DefaultInstanceManager impl } + @Override + public void backgroundProcess() { + annotationCache.maintain(); + } + + /** * Make sure that the annotations cache has been populated for the provided * class. @@ -268,10 +268,7 @@ public class DefaultInstanceManager impl List<AnnotationCacheEntry> annotations = null; while (clazz != null) { - AnnotationCacheEntry[] annotationsArray = null; - synchronized (annotationCache) { - annotationsArray = annotationCache.get(clazz); - } + AnnotationCacheEntry[] annotationsArray = annotationCache.get(clazz); if (annotationsArray == null) { if (annotations == null) { annotations = new ArrayList<>(); @@ -446,10 +443,7 @@ public class DefaultInstanceManager impl Class<?> clazz = instance.getClass(); while (clazz != null) { - AnnotationCacheEntry[] annotations; - synchronized (annotationCache) { - annotations = annotationCache.get(clazz); - } + AnnotationCacheEntry[] annotations = annotationCache.get(clazz); for (AnnotationCacheEntry entry : annotations) { if (entry.getType() == AnnotationCacheEntryType.SETTER) { lookupMethodResource(context, instance, @@ -472,9 +466,7 @@ public class DefaultInstanceManager impl * @return the cache size */ protected int getAnnotationCacheSize() { - synchronized (annotationCache) { - return annotationCache.size(); - } + return annotationCache.size(); } Modified: tomcat/tc8.5.x/trunk/java/org/apache/catalina/core/LocalStrings.properties URL: http://svn.apache.org/viewvc/tomcat/tc8.5.x/trunk/java/org/apache/catalina/core/LocalStrings.properties?rev=1780263&r1=1780262&r2=1780263&view=diff ============================================================================== --- tomcat/tc8.5.x/trunk/java/org/apache/catalina/core/LocalStrings.properties (original) +++ tomcat/tc8.5.x/trunk/java/org/apache/catalina/core/LocalStrings.properties Wed Jan 25 20:07:58 2017 @@ -112,6 +112,7 @@ pushBuilder.noPath=It is illegal to call standardContext.invalidWrapperClass={0} is not a subclass of StandardWrapper standardContext.applicationListener=Error configuring application listener of class {0} standardContext.applicationSkipped=Skipped installing application listeners due to previous error(s) +standardContext.backgroundProcess.instanceManager=Exception processing instance manager {0} background process standardContext.backgroundProcess.loader=Exception processing loader {0} background process standardContext.backgroundProcess.manager=Exception processing manager {0} background process standardContext.backgroundProcess.resources=Exception processing resources {0} background process Modified: tomcat/tc8.5.x/trunk/java/org/apache/catalina/core/StandardContext.java URL: http://svn.apache.org/viewvc/tomcat/tc8.5.x/trunk/java/org/apache/catalina/core/StandardContext.java?rev=1780263&r1=1780262&r2=1780263&view=diff ============================================================================== --- tomcat/tc8.5.x/trunk/java/org/apache/catalina/core/StandardContext.java (original) +++ tomcat/tc8.5.x/trunk/java/org/apache/catalina/core/StandardContext.java Wed Jan 25 20:07:58 2017 @@ -5568,6 +5568,16 @@ public class StandardContext extends Con resources), e); } } + InstanceManager instanceManager = getInstanceManager(); + if (instanceManager != null) { + try { + instanceManager.backgroundProcess(); + } catch (Exception e) { + log.warn(sm.getString( + "standardContext.backgroundProcess.instanceManager", + resources), e); + } + } super.backgroundProcess(); } Modified: tomcat/tc8.5.x/trunk/java/org/apache/tomcat/InstanceManager.java URL: http://svn.apache.org/viewvc/tomcat/tc8.5.x/trunk/java/org/apache/tomcat/InstanceManager.java?rev=1780263&r1=1780262&r2=1780263&view=diff ============================================================================== --- tomcat/tc8.5.x/trunk/java/org/apache/tomcat/InstanceManager.java (original) +++ tomcat/tc8.5.x/trunk/java/org/apache/tomcat/InstanceManager.java Wed Jan 25 20:07:58 2017 @@ -39,4 +39,13 @@ public interface InstanceManager { public void destroyInstance(Object o) throws IllegalAccessException, InvocationTargetException; + + /** + * Called by the component using the InstanceManager periodically to perform + * any regular maintenance that might be required. By default, this method + * is a NO-OP. + */ + public default void backgroundProcess() { + // NO-OP by default + } } Modified: tomcat/tc8.5.x/trunk/test/org/apache/catalina/core/TestDefaultInstanceManager.java URL: http://svn.apache.org/viewvc/tomcat/tc8.5.x/trunk/test/org/apache/catalina/core/TestDefaultInstanceManager.java?rev=1780263&r1=1780262&r2=1780263&view=diff ============================================================================== --- tomcat/tc8.5.x/trunk/test/org/apache/catalina/core/TestDefaultInstanceManager.java (original) +++ tomcat/tc8.5.x/trunk/test/org/apache/catalina/core/TestDefaultInstanceManager.java Wed Jan 25 20:07:58 2017 @@ -17,14 +17,22 @@ package org.apache.catalina.core; import java.io.File; +import java.lang.reflect.InvocationTargetException; + +import javax.naming.NamingException; import static org.junit.Assert.assertEquals; + +import org.junit.Ignore; import org.junit.Test; +import org.apache.catalina.Context; import org.apache.catalina.Wrapper; +import org.apache.catalina.servlets.DefaultServlet; import org.apache.catalina.startup.Tomcat; import org.apache.catalina.startup.TomcatBaseTest; import org.apache.jasper.servlet.JasperInitializer; +import org.apache.tomcat.InstanceManager; public class TestDefaultInstanceManager extends TomcatBaseTest { @@ -53,6 +61,7 @@ public class TestDefaultInstanceManager // Spin a while until GC happens or we wait too long int loop = 0; while (loop < 10) { + instanceManager.backgroundProcess(); if (instanceManager.getAnnotationCacheSize() == count) { break; } @@ -86,4 +95,70 @@ public class TestDefaultInstanceManager return (DefaultInstanceManager) ctxt.getInstanceManager(); } + + + /* + * Performance test. Comment out @Ignore to run the test. + */ + @Ignore + @Test + public void testConcurrency() throws Exception { + // Create a populated InstanceManager + Tomcat tomcat = getTomcatInstance(); + Context ctx = tomcat.addContext(null, "", null); + + tomcat.start(); + + InstanceManager im = ctx.getInstanceManager(); + + for (int i = 1; i < 9; i++) { + doTestConcurrency(im, i); + } + } + + + private void doTestConcurrency(InstanceManager im, int threadCount) throws Exception { + long start = System.nanoTime(); + + Thread[] threads = new Thread[threadCount]; + + for (int i = 0; i < threadCount; i++) { + threads[i] = new Thread(new InstanceManagerRunnable(im)); + } + + for (int i = 0; i < threadCount; i++) { + threads[i].start(); + } + + for (int i = 0; i < threadCount; i++) { + threads[i].join(); + } + + long duration = System.nanoTime() - start; + + System.out.println(threadCount + " threads completed in " + duration + "ns"); + } + + + private class InstanceManagerRunnable implements Runnable { + + private final InstanceManager im; + + private InstanceManagerRunnable(InstanceManager im) { + this.im = im; + } + + @Override + public void run() { + try { + Object test = new DefaultServlet(); + for (int i = 0; i < 200000; i++) { + im.newInstance(test); + im.destroyInstance(test); + } + } catch (NamingException | IllegalAccessException | InvocationTargetException ne) { + ne.printStackTrace(); + } + } + } } Modified: tomcat/tc8.5.x/trunk/webapps/docs/changelog.xml URL: http://svn.apache.org/viewvc/tomcat/tc8.5.x/trunk/webapps/docs/changelog.xml?rev=1780263&r1=1780262&r2=1780263&view=diff ============================================================================== --- tomcat/tc8.5.x/trunk/webapps/docs/changelog.xml (original) +++ tomcat/tc8.5.x/trunk/webapps/docs/changelog.xml Wed Jan 25 20:07:58 2017 @@ -61,6 +61,11 @@ <code>getDefaultWebXmlListener()</code>. Patch provided by Aaron Anderson. (markt) </scode> + <fix> + Reduce the contention in the default <code>InstanceManager</code> + implementation when multiple threads are managing objects and need to + reference the annotation cache. (markt) + </fix> </changelog> </subsection> <subsection name="Coyote"> --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org