<Swing Dev> [12]RFR: JDK-8198003: javax/swing/JFileChooser/6396844/TwentyThousandTest.java throws error

Krishna Addepalli krishna.addepalli at oracle.com
Wed Nov 14 05:17:56 UTC 2018


Hi Sergey,

I have noticed the presence of the Disposer thread in the local test that I have run on both Mac and Windows.
May be there could have been a mistake in pasting the log in the bug.
As you pointed out most threads are blocked, except the "AWT-Windows" and "AWT-EventQueue-0" threads, which are not. So I guess there is some time being spent in cleaning up the window resources as well.

So, coming to the test, while I agree that the timeout should be adequate for the stuff being done in the thread, this test mimics the scenario of user continuously opening folder containing a large number of files in quick succession, and sees if it leads to OOME. But, I feel it does a bit too quickly (comparing to the human speed), and that is leading it to take a little longer - since there is no control once the code is executing the COM object deletion.

Thanks,
Krishna

-----Original Message-----
From: Philip Race 
Sent: Saturday, November 3, 2018 11:28 PM
To: Sergey Bylokhov <sergey.bylokhov at oracle.com>
Cc: Krishna Addepalli <krishna.addepalli at oracle.com>; swing-dev at openjdk.java.net
Subject: Re: <Swing Dev> [12]RFR: JDK-8198003: javax/swing/JFileChooser/6396844/TwentyThousandTest.java throws error

It is very strange if there is no disposer thread.
It should be created by the first thing that requests the service in a static initializer block for the class and then live forever.
Could it be that OOME was thrown on that thread ? It looks like it would cause the thread to exit.
I don't expect we do much allocation there - it is all about the opposite.
Still, the Disposer.run() method only catches Exception and OOME is a subclass of Error, not Exception.
We should probably change the run() method to catch Throwable.

-phil.


On 10/31/18, 11:44 AM, Sergey Bylokhov wrote:
> Hi, Krishna.
>
> The current timeout for this test is 1000 seconds, which is 16 minutes.
> I guess such timeout should be enough for everything which is done in 
> this test.
>
> BTW there is no Disposer thread in the stack, it is also strange that 
> most of the threads in the stack thread are blocked.
>
> See some comments inline.
>
> On 31/10/2018 07:58, Krishna Addepalli wrote:
>> Hi All,
>>
>> Please review a fix for JDK-8198003: 
>> https://bugs.openjdk.java.net/browse/JDK-8198003
>>
>> Webrev: http://cr.openjdk.java.net/~kaddepalli/8198003/webrev00
>>
>> This test tries to create a huge(20000) files and show them in 
>> JFileChooser, which inturn creates 20000 instances of File class.
>> This internally has a reference to native file handle through COM 
>> object (IShellFolder), which is added to java2d.Disposer, to be 
>> disposed after use. The test then tries to fill the memory and 
>> thereby tries to check if the File records are deleted by GC. It 
>> repeats this test about 20 times for each of the installed L&Fs. So 
>> the problem essentially boils down to how fast the Disposer thread 
>> can clean up the objects, which may not always obey the time limit 
>> constraints.
>
> The test uses java2d.Disposer as a way to delay next iteration and to 
> not overload the system, the test assumes that if its own 
> disposerRecord is executed then it is likely all previous objects are 
> collected. Instead of this mechanics we can use simple sleep(), but I 
> think that the root cause is an absent of Disposer thread, which means 
> that our disposerRecord will not be executed, and our test will hang 
> forever.
>
> It is also strange that the "Swing-Shell" thread which should dispose 
> the native IShellFolder is also blocked and do nothing.
>
>>
>> On Mac, the test always throws OOME – while running for Aqua L&F. Now 
>> the difference between the other L&Fs and Aqua is that, it in Aqua 
>> L&F, each File instance is wrapped inside SortableFile class, which 
>> are then presented in the JFileChooser, to provide quick sorting of 
>> the files. So, this makes it a tad bit slower in Mac to release the 
>> File objects.
>>
>> The solution is three fold:
>>
>> 1.After each run, make sure System.gc() is called to make sure that 
>> some memory is available for subsequent run. Also, a Global Exception 
>> Handler is registered which does another round of GC calls to make 
>> sure that the memory is not run out of.
>>
>> 2.Reduce the number of times the test runs (down from 20 to 10), 
>> since running additional number of times only increases the test case 
>> runtime without any additional information.
>>
>> 3.Create and Delete files parallelly – although this doesn’t have a 
>> big impact, it does help to provide more time for the actual test to 
>> run.
>>
>> Even with these changes, the test fails sometimes on Mac while 
>> running Aqua L&F, so this L&F can be skipped.
>>
>> Thanks,
>>
>> Krishna
>>
>
>


More information about the swing-dev mailing list