RFR: 6988220: java.lang.ObjectName use of String.intern() causes major performance issues at scale

Krystal Mok rednaxelafx at gmail.com
Thu Feb 23 18:08:42 PST 2012


Hi Keith,

> Another problem with using 'intern()' is that when you intern a string
you're placing it into the permgen, and space there is at a premium. (no
perm gen project will hopefully fix this soon).

Actually that's fixed already, in 6962931 and a couple of related fixes
later.

- Kris

On Fri, Feb 24, 2012 at 6:23 AM, Keith McGuigan
<keith.mcguigan at oracle.com>wrote:

>
> Making String.intern() more scalable has been on our list of things-to-do
> for a long, long time.  But, it's not trivial.  Simply increasing the size
> of the hashtable is no good because we'd be upping our footprint
> unconditionally, so really we want a growing hashtable which is a bit more
> effort (though not impossible, of course, it just hasn't bubbled up to the
> top of the priority list).
>
> Another problem with using 'intern()' is that when you intern a string
> you're placing it into the permgen, and space there is at a premium. (no
> perm gen project will hopefully fix this soon).
>
> If you really want to use == instead of "equals()", you can use a
> java.util "set" or "map" data structure and stash all of your strings in
> there.  Then you'll have canonicalized references that == will work upon,
> and you won't run into the intern() scalability (or concurrency) issues.
>
> --
> - Keith
>
>
>
> On 2/23/2012 4:53 PM, David Holmes wrote:
>
>> Hi Fred,
>>
>> java.lang.ObjectName? :) Need to fix that.
>>
>> So often we intern strings precisely so that equals() can use == to
>> improve performance.
>>
>> It seems to me that this is a case of "fixing" something for one
>> use-case without knowing what the impact will be on other use-cases!
>>
>> Is there perhaps a solution that makes String.intern more scalable?
>>
>> David
>> -----
>>
>> On 24/02/2012 1:36 AM, Frederic Parain wrote:
>>
>>> This a simple fix to solve CR 6988220:
>>> http://bugs.sun.com/**bugdatabase/view_bug.do?bug_**id=6988220<http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6988220>
>>>
>>> The use of String.intern() in the ObjectName class prevents
>>> the class the scale well when more than 20K ObjectNames are
>>> managed. The fix simply removes the use of String.intern(),
>>> and uses regular String instead. The Object.equals() method
>>> is modified too to make a regular String comparison. The
>>> complexity of this method now depends on the length of
>>> the ObjectName's canonical name, and is not impacted any
>>> more by the number of ObjectName instances being handled.
>>>
>>> The Webrev:
>>> http://cr.openjdk.java.net/~**fparain/6988220/webrev.00/<http://cr.openjdk.java.net/~fparain/6988220/webrev.00/>
>>>
>>> I've tested this fix with the jdk_lang and jdk_management
>>> test suites.
>>>
>>> Thanks,
>>>
>>> Fred
>>>
>>>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.openjdk.java.net/pipermail/serviceability-dev/attachments/20120224/718b0f46/attachment.html 


More information about the serviceability-dev mailing list