<AWT Dev> <Swing Dev> sun.awt.X11 logs still using String + (waste)
Anthony Petrov
anthony.petrov at oracle.com
Tue Apr 9 06:08:35 PDT 2013
Hi Laurent,
Thanks for all your hard work! The fix looks fine to me.
I'm also CC'ing jdk8-dev@ to let other teams review the changes in their
areas. I've only reviewed the AWT part of the fix.
--
best regards,
Anthony
On 4/8/2013 15:32, Laurent Bourgès wrote:
> Anthony,
>
> here is an updated patch concerning both PlatformLogger and Logger 'bad'
> usages:
> http://jmmc.fr/~bourgesl/share/webrev-8010297.3/
>
> It impacts now awt, swing, JMX, security, network, and apache xml.
>
> Thanks for the review,
> Laurent
>
> 2013/4/8 Laurent Bourgès <bourges.laurent at gmail.com
> <mailto:bourges.laurent at gmail.com>>
>
> Peter, Mandy,
>
> I think it would be great to make PlatformLogger very similar to
> Logger API:
> I mean JUL Logger already has only 1 convenient method with 1 param
> so it may be great to have the same API in PlatformLogger too: maybe
> extend it to 2 or 3 params ...
>
> Peter, could you look at the API differences between Logger /
> PlatformLogger to make PlatformLogger API more similar to JUL Logger ?
>
> Laurent
>
>
> 2013/4/8 Peter Levart <peter.levart at gmail.com
> <mailto:peter.levart at gmail.com>>
>
> On 04/07/2013 07:11 PM, Laurent Bourgès wrote:
>>
>> Hi
>>
>> I started fixing All PlatformlLogger "bad" usages and I am
>> fixing also many jul Logger usages without isLoggable ...
>> That represents a lot of changes and a very boring job.
>>
>> I think sending a webrew tomorrow.
>>
>
> Hi Laurent,
>
> Since you're already deep in the task, you might have a rough
> feeling what part of such unguarded log statements are of the
> following type:
>
> logger.[fine,info,...]("a message with {0} and {1}
> placeholders", someArg1, someArg2);
>
> where someArg1, ... are some values that are already present in
> the context of the logging statement and don't have to be
> computed just for satisfying the logging (not even boxing). Such
> usages could be effectively optimized by adding some overloaded
> methods to PlatformLogger that take 1, 2, 3, ... arguments:
>
> class PlatformLogger {
>
> ...
>
> public void finest(String msg, Object param1) {
> if (isLoggable(Level.FINEST)) {
> loggerProxy.doLog(Level.FINEST, msg, param1);
> }
> }
>
> public void finest(String msg, Object param1, Object param2) {
> if (isLoggable(Level.FINEST)) {
> loggerProxy.doLog(Level.FINEST, msg, param1, param2);
> }
> }
>
> public void finest(String msg, Object param1, Object param2,
> Object param3) {
> if (isLoggable(Level.FINEST)) {
> loggerProxy.doLog(Level.FINEST, msg, param1, param2,
> param3);
> }
> }
>
> ...
>
> This would effectively guard creation of the arguments array
> with an isLoggable check for some common usages, eliminating the
> need to explicitly guard such statements. Of course, the user
> would have to be aware of when such unguarded logging statement
> is without overhead and when not...
>
> How do you feel about such API extension?
>
>
> Regards, Peter
>
>
>
>> Laurent
>>
>> Le 4 avr. 2013 14:08, "Laurent Bourgès"
>> <bourges.laurent at gmail.com <mailto:bourges.laurent at gmail.com>>
>> a écrit :
>>
>> Ok, I can provide an updated patch after finding / fixing
>> all usages.
>>
>> Probably in 1 or 2 days,
>>
>> Laurent
>>
>> 2013/4/4 Anthony Petrov <anthony.petrov at oracle.com
>> <mailto:anthony.petrov at oracle.com>>
>>
>> Yes, this makes sense. Do you want to update your fix
>> for 8010297 to include these changes as well?
>>
>> --
>> best regards,
>> Anthony
>>
>>
>> On 04/04/13 15:47, Laurent Bourgès wrote:
>>
>> Dear all,
>>
>> I just realized there is another problem with
>> PlatformLogger log statements:
>> XBaseWindow:
>> public boolean grabInput() {
>> grabLog.fine("Grab input on {0}", this);
>> ...
>> }
>>
>> This calls the PlatformLogger.fine( varargs):
>> public void fine(String msg, Object... params) {
>> logger.doLog(FINE, msg, params);
>> }
>>
>> Doing so, the JVM creates a new Object[] instance
>> to provide params as
>> varargs.
>>
>> I would recommend using isLoggable() test to avoid
>> such waste if the log
>> is disabled (fine, finer, finest ...).
>>
>> Do you want me to provide a new patch related to
>> this problem ?
>>
>> Does somebody have an idea to automatically
>> analyze the JDK code and
>> detect missing isLoggable statements ...
>>
>> Regards,
>> Laurent
>>
>> 2013/4/3 Laurent Bourgès
>> <bourges.laurent at gmail.com
>> <mailto:bourges.laurent at gmail.com>
>> <mailto:bourges.laurent at gmail.com
>> <mailto:bourges.laurent at gmail.com>>>
>>
>>
>> Anthony,
>>
>> could you tell me once it is in the OpenJDK8
>> repository ?
>> I would then perform again profiling tests to
>> check if there is no
>> more missing isLoggable() statements.
>>
>> Once JMX and other projects switch to
>> PlatformLogger, I could check
>> again.
>>
>> Maybe I could write a small java code checker
>> (pmd rule) to test if
>> there is missing isLoggable() statements
>> wrapping PlatformLogger log
>> statements. Any idea about how to reuse java
>> parser to do so ?
>>
>> Regards,
>>
>> Laurent
>>
>> 2013/4/2 Anthony Petrov
>> <anthony.petrov at oracle.com
>> <mailto:anthony.petrov at oracle.com>
>> <mailto:anthony.petrov at oracle.com
>> <mailto:anthony.petrov at oracle.com>>>
>>
>>
>> Looks fine to me as well. Thanks for
>> fixing this, Laurent.
>>
>> Let's wait a couple more days in case Net
>> or Swing folks want to
>> review the fix. After that I'll push it to
>> the repository.
>>
>> --
>> best regards,
>> Anthony
>>
>>
>> On 4/2/2013 15:35, Laurent Bourgès wrote:
>>
>> Here is the updated patch:
>>
>> http://jmmc.fr/~bourgesl/__share/webrev-8010297.2/
>> <http://jmmc.fr/%7Ebourgesl/__share/webrev-8010297.2/>
>>
>> <http://jmmc.fr/%7Ebourgesl/share/webrev-8010297.2/>
>>
>>
>> Fixed inconsistencies between FINE /
>> FINER log statements:
>> - XScrollbarPeer
>> - XWindowPeer
>>
>> Laurent
>>
>> 2013/4/2 Anthony Petrov
>> <anthony.petrov at oracle.com
>> <mailto:anthony.petrov at oracle.com>
>> <mailto:anthony.petrov at oracle.com
>> <mailto:anthony.petrov at oracle.com>>
>> <mailto:anthony.petrov at oracle.
>> <mailto:anthony.petrov at oracle.>__com
>>
>> <mailto:anthony.petrov at oracle.com
>> <mailto:anthony.petrov at oracle.com>>>>
>>
>>
>> 1. Sergey: I believe this is for
>> purposes of better
>> formating the
>> log output and making it more
>> readable by separating or
>> highlighting
>> some sections. I don't think this
>> should be changed.
>>
>> 2. Laurent: can you please
>> address this issue and send
>> us a new patch?
>>
>> --
>> best regards,
>> Anthony
>>
>>
>> On 4/1/2013 16:08, Sergey
>> Bylokhov wrote:
>>
>>
>> Hi, Anthony
>> Only two comments:
>> 1 Why we need some special
>> text in the log output
>> like "***" and
>> "###"
>> 2 XScrollbarPeer.java:
>>
>> + if
>>
>> (log.isLoggable(____PlatformLogger.FINEST)) {
>>
>>
>> +
>> log.finer("KeyEvent on scrollbar: " +
>> event);
>> + }
>>
>>
>>
>> On 4/1/13 12:20 PM, Anthony
>> Petrov wrote:
>>
>> Awt, Swing, Net engineers,
>>
>> Could anyone review the
>> fix please? For your
>> convenience:
>>
>> Bug:
>>
>> http://bugs.sun.com/view_bug.____do?bug_id=8010297
>>
>> <http://bugs.sun.com/view_bug.__do?bug_id=8010297>
>>
>>
>> <http://bugs.sun.com/view_bug.__do?bug_id=8010297
>>
>> <http://bugs.sun.com/view_bug.do?bug_id=8010297>>
>>
>> Fix:
>>
>> http://cr.openjdk.java.net/~____anthony/8-55-isLoggable-____8010297.0/
>> <http://cr.openjdk.java.net/%7E____anthony/8-55-isLoggable-____8010297.0/>
>>
>> <http://cr.openjdk.java.net/%7E__anthony/8-55-isLoggable-__8010297.0/>
>>
>> <http://cr.openjdk.java.net/%__7Eanthony/8-55-isLoggable-__8010297.0/
>>
>> <http://cr.openjdk.java.net/%7Eanthony/8-55-isLoggable-8010297.0/>>
>>
>> -- best regards,
>> Anthony
>>
>> On 3/22/2013 2:26,
>> Anthony Petrov wrote:
>>
>> Hi Laurent,
>>
>> The fix looks great
>> to me. Thank you very much.
>>
>> We still need at
>> least one review, though.
>> Hopefully
>> net-dev@ and/or
>> swing-dev@ folks might help
>> us out a bit.
>>
>> --
>> best regards,
>> Anthony
>>
>> On 3/20/2013 15:10,
>> Anthony Petrov wrote:
>>
>> Hi Laurent,
>>
>> Thanks for the
>> patch. I've filed a bug at:
>>
>> http://bugs.sun.com/view_bug.____do?bug_id=8010297
>>
>> <http://bugs.sun.com/view_bug.__do?bug_id=8010297>
>>
>>
>>
>> <http://bugs.sun.com/view_bug.__do?bug_id=8010297
>>
>> <http://bugs.sun.com/view_bug.do?bug_id=8010297>>
>> (should be
>> available in a day or two)
>>
>> and published a
>> webrev generated from
>> your patch at:
>>
>> http://cr.openjdk.java.net/~____anthony/8-55-isLoggable-____8010297.0/
>> <http://cr.openjdk.java.net/%7E____anthony/8-55-isLoggable-____8010297.0/>
>>
>> <http://cr.openjdk.java.net/%7E__anthony/8-55-isLoggable-__8010297.0/>
>>
>> <http://cr.openjdk.java.net/%__7Eanthony/8-55-isLoggable-__8010297.0/
>>
>> <http://cr.openjdk.java.net/%7Eanthony/8-55-isLoggable-8010297.0/>>
>>
>>
>> I'm also copying
>> swing-dev@ and
>> net-dev@ because the
>> fix affects those
>> areas too. I myself
>> will review
>> the fix a bit
>> later but am sending it
>> now for other
>> folks to take a
>> look at it.
>>
>> On 3/19/2013
>> 15:29, Laurent Bourgès wrote:
>>
>> I am sorry I
>> started modifying
>> PlatformLogger
>> and reverted
>> changes to this class
>> as it is
>> another topic
>> to be discussed
>> later: isLoggable
>> performance
>> and waste due to
>> HashMap<Integer,
>> Level> leads
>> to Integer allocations
>> (boxing).
>>
>>
>> I saw your
>> message to core-libs-dev@,
>> so I just
>> dropped all
>> changes to the
>> PlatformLogger from this
>> patch.
>>
>> Finally, I
>> have another question
>> related to the
>>
>> WrapperGenerator class: it
>> generates a lot of
>> empty log
>> statements (XEvent):
>>
>> log
>>
>> <http://grepcode.com/file/____repository.grepcode.com/java/____root/jdk/openjdk/6-b14/sun/____awt/X11/XWrapperBase.java#____XWrapperBase.0log
>>
>> <http://grepcode.com/file/__repository.grepcode.com/java/__root/jdk/openjdk/6-b14/sun/__awt/X11/XWrapperBase.java#__XWrapperBase.0log>
>>
>>
>>
>> <http://grepcode.com/file/__repository.grepcode.com/java/__root/jdk/openjdk/6-b14/sun/__awt/X11/XWrapperBase.java#__XWrapperBase.0log
>>
>> <http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/sun/awt/X11/XWrapperBase.java#XWrapperBase.0log>>>.finest
>>
>> <http://grepcode.com/file/____repository.grepcode.com/java/____root/jdk/openjdk/6-b14/java/____util/logging/Logger.java#____Logger.finest%28java.lang.____String%29
>>
>> <http://grepcode.com/file/__repository.grepcode.com/java/__root/jdk/openjdk/6-b14/java/__util/logging/Logger.java#__Logger.finest%28java.lang.__String%29>
>>
>>
>>
>> <http://grepcode.com/file/__repository.grepcode.com/java/__root/jdk/openjdk/6-b14/java/__util/logging/Logger.java#__Logger.finest%28java.lang.__String%29
>>
>> <http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/logging/Logger.java#Logger.finest%28java.lang.String%29>>>("");
>>
>>
>> Is it really
>> useful to have such
>> statements ? I
>> would keep
>> logs with non empty
>> messages only.
>>
>> See
>> WrapperGenerator:753:
>>
>> String s_log =
>>
>> (generateLog?"log.finest(\"\")____;":"");
>>
>>
>>
>>
>> I believe they're
>> used for log
>> formatting purposes
>> to separate
>> numerous events in a log
>> (e.g. think of
>> mouse-move events
>> - there can be
>> hundreds of them in
>> a raw).
>>
>>
>> Please note that
>> the hg export format
>> is not that
>> useful unless
>> you're assigned an
>> OpenJDK id already
>> (please see
>> Dalibor's message for
>> details) because I
>> can't import it
>> directly. So for the
>> time being you
>> could send just
>> raw patches (i.e. the
>> output of hg
>> diff only - and
>> there's no need to
>> commit your
>> changes in this
>> case). Also, please
>> note that the
>> mailing lists
>> strip attachments. The
>> reason I got it
>> is because I was
>> listed in To: of your
>> message. So
>> when sending
>> patches you can:
>> 1) post them
>> inline, or
>> 2) attach them
>> and add a person to To:
>> of your
>> message, or
>> 3) upload them
>> somewhere on the web.
>> However, it would
>> be best if you could
>> generate a
>> webrev for your
>> changes and upload it
>> somewhere.
>> Currently this is
>> the standard format
>> for reviewing
>> fixes in OpenJDK.
>>
>> --
>> best regards,
>> Anthony
>>
>>
>> Regards,
>> Laurent
>>
>>
>>
>> 2013/3/19
>> Laurent Bourgès
>> <bourges.laurent at gmail.com
>> <mailto:bourges.laurent at gmail.com>
>> <mailto:bourges.laurent at gmail.com
>> <mailto:bourges.laurent at gmail.com>>
>> <mailto:bourges.laurent at gmail.
>> <mailto:bourges.laurent at gmail.>__com
>> <mailto:bourges.laurent at gmail.com
>> <mailto:bourges.laurent at gmail.com>>>
>> <mailto:bourges.laurent at gmail
>> <mailto:bourges.laurent at gmail>.
>> <mailto:bourges.laurent at gmail
>> <mailto:bourges.laurent at gmail>.>____com
>>
>> <mailto:bourges.laurent at gmail.
>> <mailto:bourges.laurent at gmail.>__com
>> <mailto:bourges.laurent at gmail.com
>> <mailto:bourges.laurent at gmail.com>>>>>
>>
>> Hi antony,
>>
>> FYI I
>> started reviewing and
>> fixing all
>>
>> PlatformLogger use cases (not
>> too many
>> as I thought first)
>> mainly used by
>> awt / swing
>> projects to
>> provide
>> you a patch on latest
>> JDK8 source code:
>>
>> I am
>> adding the log level check
>> when it is
>> missing:
>> if
>>
>> (...log.isLoggable(____PlatformLogger.xxx)) {
>>
>>
>> log...
>> }
>>
>> I will
>> not change the String +
>> operations to
>> use the
>> message format
>> syntax in
>> this patch.
>>
>> Do you
>> accept such patch / proposed
>> contribution ?
>>
>> Regards,
>> Laurent
>>
>>
>> 2013/3/18
>> Laurent Bourgès
>> <bourges.laurent at gmail.com
>> <mailto:bourges.laurent at gmail.com>
>> <mailto:bourges.laurent at gmail.com
>> <mailto:bourges.laurent at gmail.com>>
>> <mailto:bourges.laurent at gmail.
>> <mailto:bourges.laurent at gmail.>__com
>> <mailto:bourges.laurent at gmail.com
>> <mailto:bourges.laurent at gmail.com>>>
>> <mailto:bourges.laurent at gmail
>> <mailto:bourges.laurent at gmail>.
>> <mailto:bourges.laurent at gmail
>> <mailto:bourges.laurent at gmail>.>____com
>>
>> <mailto:bourges.laurent at gmail.
>> <mailto:bourges.laurent at gmail.>__com
>> <mailto:bourges.laurent at gmail.com
>> <mailto:bourges.laurent at gmail.com>>>>>
>>
>> Hi
>> antony,
>>
>> 2
>> different things:
>> 1/
>> PlatformLogger was
>> patched (doLog
>> method) to
>> avoid string
>>
>> operations (message
>> formatting) for
>> disabled logs
>> (patch
>>
>> submiited on JDK8 and JDK7u):
>>
>> http://mail.openjdk.java.net/____pipermail/jdk7u-dev/2012-____April/002751.html
>>
>> <http://mail.openjdk.java.net/__pipermail/jdk7u-dev/2012-__April/002751.html>
>>
>>
>>
>>
>> <http://mail.openjdk.java.net/__pipermail/jdk7u-dev/2012-__April/002751.html
>>
>> <http://mail.openjdk.java.net/pipermail/jdk7u-dev/2012-April/002751.html>>
>>
>>
>> 2/ I
>> looked 2 hours ago on
>> JDK7u AND
>> JDK8 source
>> codes and both
>> still
>> have:
>> - log
>> statements WITHOUT
>> log level check
>> : if
>>
>> (log.isLoggable(____PlatformLogger.FINE))
>>
>>
>> log.fine(...);
>> -
>> string operations (+) in
>> log calls
>> that could be
>> improved
>> using
>> the message format
>> syntax (String
>> + args): for
>> example,
>> avoid
>> using
>> PlatformLogger.fine(String +
>> ...) in favor
>> of using
>>
>> PlatformLogger.fine(String msg,
>> Object... params)
>>
>> I
>> reported in my previous
>> mail several
>> cases where the
>>
>> isLoggable() call is
>> missing and leads
>> to useless String
>>
>> operations but also method
>> calls
>>
>> (Component.paramString() for
>> example).
>>
>>
>> Finally, I also provided
>> other possible
>> cases (using
>> grep);
>> maybe
>> there is a better
>> alternative to
>> find all
>> occurences of
>>
>> String operations in log calls.
>>
>> Regards,
>> Laurent
>>
>>
>> 2013/3/18 Anthony Petrov
>> <anthony.petrov at oracle.com
>> <mailto:anthony.petrov at oracle.com>
>> <mailto:anthony.petrov at oracle.com
>> <mailto:anthony.petrov at oracle.com>>
>> <mailto:anthony.petrov at oracle.
>> <mailto:anthony.petrov at oracle.>__com
>> <mailto:anthony.petrov at oracle.com
>> <mailto:anthony.petrov at oracle.com>>>
>> <mailto:anthony.petrov at oracle
>> <mailto:anthony.petrov at oracle>.
>> <mailto:anthony.petrov at oracle
>> <mailto:anthony.petrov at oracle>.>____com
>>
>> <mailto:anthony.petrov at oracle.
>> <mailto:anthony.petrov at oracle.>__com
>> <mailto:anthony.petrov at oracle.com
>> <mailto:anthony.petrov at oracle.com>>>>>
>>
>>
>> Hi Laurent,
>>
>>
>> Normally we fix an
>> issue in JDK 8
>> first, and
>> then back-port
>>
>> the fix to a 7u
>> release. You're
>> saying that
>> in JDK 8 the
>>
>> problem isn't
>> reproducible anymore.
>> Can you please
>>
>> investigate (using the
>> Mercurial
>> history log)
>> what exact fix
>>
>> resolved it in JDK 8?
>>
>> --
>>
>> best regards,
>>
>> Anthony
>>
>>
>> On 03/18/13 15:09,
>> Laurent Bourgès
>> wrote:
>>
>>
>> Dear all,
>>
>>
>> I run recently
>> netbeans profiler
>> on my swing
>> application
>>
>> (Aspro2:
>> http://www.jmmc.fr/aspro) under
>> linux x64
>> platform and I
>>
>> figured out
>>
>> that a lot of
>> char[] instances
>> are coming
>> from String +
>>
>> operator called
>>
>> by sun.awt.X11 code.
>>
>>
>> I looked at
>> PlatformLogger
>> source code
>> but found not way
>>
>> to disable it
>>
>> completely: maybe
>> an empty
>> logger
>> implementation could
>>
>> be interesting to
>>
>> be used during
>> profiling or
>> normal use
>> (not debugging).
>>
>> Apparently JDK8
>> provides some
>> patchs to
>> avoid String
>>
>> creation when the
>>
>> logger is disabled
>> (level).
>>
>>
>> However, I looked
>> also to the
>> sun.awt code
>> (jdk7u
>>
>> repository) to see the
>>
>> origin of the
>> string allocations:
>>
>> XDecoratedPeer:
>>
>> public void
>>
>> handleFocusEvent(XEvent xev) {
>>
>> ...
>> *
>> focusLog.finer("Received
>> focus event on shell:
>> " + xfe);
>>
>> * }
>>
>>
>> public boolean
>>
>> requestWindowFocus(long time,
>>
>> boolean timeProvided) {
>>
>> ...
>> *
>> focusLog.finest("Real
>> native focused
>>
>> window: " +
>>
>> realNativeFocusedWindow +
>> "\nKFM's focused window: " +
>> focusedWindow);
>>
>> *...
>> *
>> focusLog.fine("Requesting
>> focus to " + (this ==
>>
>> toFocus ? "this
>>
>> window" : toFocus));
>>
>> *...
>> }
>>
>>
>> XBaseWindow:
>>
>> public void
>> xSetBounds(int
>> x, int y, int
>> width, int
>>
>> height) {
>>
>> ...
>> *
>> insLog.fine("Setting
>> bounds on " +
>> this + " to
>>
>> (" + x + ", " +
>>
>> y + "), " + width +
>> "x" + height);
>>
>> *}
>>
>>
>> XNetProtocol:
>>
>> boolean
>> doStateProtocol() {
>>
>> ...
>> *
>>
>> stateLog.finer("______doStateProtocol() returns " +
>>
>>
>>
>> res);
>>
>> *}
>>
>>
>> XSystemTrayPeer:
>>
>> XSystemTrayPeer(SystemTray
>> target) {
>>
>> ...
>>
>> * log.fine("
>> check if
>> system tray
>> is available.
>>
>> selection owner:
>> " + selection_owner);
>>
>> *}
>>
>> void
>>
>> addTrayIcon(XTrayIconPeer tiPeer)
>> throws
>>
>> AWTException {
>>
>> ...
>>
>> * log.fine("
>> send
>>
>> SYSTEM_TRAY_REQUEST_DOCK
>>
>> message to owner: " +
>>
>> selection_owner);
>>
>> *}
>>
>>
>> XFramePeer:
>>
>> public void
>>
>> handlePropertyNotify(XEvent xev) {
>>
>> ...
>>
>> stateLog.finer("State
>> is the same: " + state);
>> }
>>
>>
>> However I only give
>> here few
>> cases but
>> certainly others
>>
>> are still
>>
>> present in the
>> source code;
>> maybe
>> findbugs or netbeans
>>
>> warnings could
>>
>> help you finding
>> all of them.
>>
>>
>> I advocate the
>> amount of waste
>> (GC) is not very
>>
>> important but String
>>
>> conversion are also
>> calling
>> several
>> toString() methods
>>
>> that can be
>>
>> costly (event,
>> Frame, window ...)
>>
>>
>> Finally, I ran few
>> grep commands
>> on the
>> sun.awt.X11 code
>>
>> (jdk7u) and you
>>
>> can look at them to
>> see all
>> string +
>> operations related
>>
>> to log statements.
>>
>>
>> PS: I may help
>> fixing the source
>> code but I
>> have no idea
>>
>> how to
>>
>> collaborate
>> (provide a patch ?)
>>
>>
>> Regards,
>>
>> Laurent Bourgès
>>
>>
>>
>>
>>
>>
>> -- Best regards, Sergey.
>>
>>
>>
>>
>>
>
>
>
More information about the jdk8-dev
mailing list