<AWT Dev> <Swing Dev> sun.awt.X11 logs still using String + (waste)
Laurent Bourgès
bourges.laurent at gmail.com
Wed Apr 10 09:01:48 UTC 2013
Anthony or Mandy,
Could you ask JMX / Security groups for me to review my patch ?
I am currently not registered to these mailing lists.
Do you ask me to split the patch in two part: PlatformLogger on one side
and Logger on the other side ?
Laurent
2013/4/9 Mandy Chung <mandy.chung at oracle.com>
> On 4/9/13 12:37 AM, Laurent Bourgès wrote:
>
> Mandy,
>
> first I would like to have the given patch applied to OpenJDK 8 (+ JDK7u)
> as it fixes many problems:
> - string concatenations
> - object creations (Object[] or other objects given as params)
> - method calls in log statements
>
> This is the patch you refer to:
> http://jmmc.fr/~bourgesl/share/webrev-8010297.3/
>
> I agree that we should separate the fix to reduce the memory usage from
> the fix to convert JUL to PlatformLogger. I skimmed on your patch -
> awt/swing uses PlatformLogger and your change looks fine. You have also
> got Anthony's approval. Other component security, jmx, snmp, etc are using
> JUL. I would suggest to fix the use of PlatformLogger in your first patch
> and AWT/Swing is the main area that 8010297 is concerned about so that you
> can resolve 8010297 soon.
>
> If you want to move ahead to fix use of JUL, you can send your patch to
> serviceability-dev at openjdk.java.net and security-dev at openjdk.java.net for
> the other areas to review and sponsor.
>
> Hope this helps.
> Mandy
>
>
> In a second step, I can help somebody migrating JUL usages to
> PlatformLogger but it requires PlatformLogger API changes (logp to give
> class and method names)...
>
> Other comments below:
>
>>
>> Peter's idea is a good one to add a couple of convenient methods to take
>> Object parameters that will avoid the creation of array instances. I'd
>> also like to know what variants being used in the jdk to determine the pros
>> and cons of the alternatives (this issue also applies to java.util.logging).
>>
>
> 50% of given object parameters are created via method calls so it will not
> be enough.
>
> Moreover, I prefer having always isLoggable() calls to avoid me looking
> and understanding special cases (more than 2 args or no string concat ...);
> besides, it would be easier to implement code checks testing missing
> isLoggable() calls vs conditional and specific checks (string concat, more
> then 2 args, method calls ...)
>
> Finally, I prefer having shorter and clearer method names like isFine(),
> isFinest() instead of isLoggable(PlatformLogger.FINE) that is quite "ugly"
> ...
>
>
>> It was intentional to have PlatformLogger define only the useful methods
>> necessary for jdk use. The goal of PlatformLogger was to provide a
>> light-weight utility for jdk to log debugging messages and eliminate the
>> dependency to java.util.logging and avoid the unnecessary j.u.logging
>> initialization (as disabled by default). It was not a goal for
>> PlatformLogger to be an exact mirror as java.util.logging.Logger. My
>> advice is to tune PlatformLogger to provide API that helps the platform
>> implementation while avoid bloating the API.
>>
>
> Agreed.
>
> Maybe JUL Logger.logp(classname, methodname) usages should be rewritten to
> use PlatformLogger.getCallerInfo() instead:
> // Returns the caller's class and method's name; best effort
> // if cannot infer, return the logger's name.
> private String getCallerInfo() {
> String sourceClassName = null;
> String sourceMethodName = null;
>
> * JavaLangAccess access = SharedSecrets.getJavaLangAccess();
> * Throwable throwable = new Throwable();
> int depth = access.getStackTraceDepth(throwable);
>
> String logClassName = "sun.util.logging.PlatformLogger";
> boolean lookingForLogger = true;
> for (int ix = 0; ix < depth; ix++) {
> // Calling getStackTraceElement directly prevents the VM
> // from paying the cost of building the entire stack frame.
> StackTraceElement frame =
> access.getStackTraceElement(throwable, ix);
> String cname = frame.getClassName();
> if (lookingForLogger) {
> // Skip all frames until we have found the first
> logger frame.
> if (cname.equals(logClassName)) {
> lookingForLogger = false;
> }
> } else {
> if (!cname.equals(logClassName)) {
> // We've found the relevant frame.
> sourceClassName = cname;
> sourceMethodName = frame.getMethodName();
> break;
> }
> }
> }
>
> if (sourceClassName != null) {
> return sourceClassName + " " + sourceMethodName;
> } else {
> return name;
> }
> }
> }
>
>
>>
>> Since you are touching some jdk files that use java.util.logging, would
>> you like to contribute to convert them to use PlatformLogger:
>> http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7054233
>>
>> It's perfectly fine to convert only some of them if not all.
>>
>
> I want to help but as you said it should be done in collaboration because
> it requires API changes (JMX, RMI ...) but I prefer after this patch is
> reviewed and submitted and in coming weeks.
>
>
>>
>> Jim Gish is the owner of logging and will check with him if he has cycles
>> to work with you on this.
>>
>
> Great.
>
> Cheers,
> Laurent
>
>
>
More information about the core-libs-dev
mailing list