2015-01-07 14:15:37 +00:00
/ *
2023-10-27 08:47:26 +00:00
* Copyright ( c ) 2014 , 2023 , Oracle and / or its affiliates . All rights reserved .
2015-01-07 14:15:37 +00:00
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER .
*
* This code is free software ; you can redistribute it and / or modify it
* under the terms of the GNU General Public License version 2 only , as
* published by the Free Software Foundation .
*
* This code is distributed in the hope that it will be useful , but WITHOUT
* ANY WARRANTY ; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE . See the GNU General Public License
* version 2 for more details ( a copy is included in the LICENSE file that
* accompanied this code ) .
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work ; if not , write to the Free Software Foundation ,
* Inc . , 51 Franklin St , Fifth Floor , Boston , MA 02110 - 1301 USA .
*
* Please contact Oracle , 500 Oracle Parkway , Redwood Shores , CA 94065 USA
* or visit www . oracle . com if you need additional information or have any
* questions .
* /
2019-01-28 14:53:56 +00:00
package gc.g1 ;
2015-01-07 14:15:37 +00:00
/ *
* @test TestEagerReclaimHumongousRegionsWithRefs
* @bug 8048179
* @summary Test to make sure that eager reclaim of humongous objects that have previously
* been referenced by other old gen regions work . We simply try to fill
* up the heap with humongous objects and create a remembered set entry from an object by
* referencing that we know is in the old gen . After changing this reference , the object
* should still be eagerly reclaimable to avoid Full GC .
2016-08-29 19:04:48 +00:00
* @requires vm . gc . G1
2016-08-19 14:06:30 +00:00
* @library / test / lib
2016-04-09 22:03:39 +00:00
* @modules java . base / jdk . internal . misc
2015-03-26 15:36:56 +00:00
* java . management
2020-04-29 14:08:31 +00:00
* @run driver gc . g1 . TestEagerReclaimHumongousRegionsWithRefs
2015-01-07 14:15:37 +00:00
* /
import java.util.regex.Pattern ;
import java.util.regex.Matcher ;
import java.util.LinkedList ;
2016-08-19 14:06:30 +00:00
import jdk.test.lib.process.OutputAnalyzer ;
import jdk.test.lib.process.ProcessTools ;
2015-05-04 14:30:07 +00:00
import static jdk.test.lib.Asserts.* ;
2015-01-07 14:15:37 +00:00
class RefHolder {
Object ref ;
}
2019-01-28 14:53:56 +00:00
class TestEagerReclaimHumongousRegionsWithRefsReclaimRegionFast {
2015-01-07 14:15:37 +00:00
public static final int M = 1024 * 1024 ;
public static LinkedList < Object > garbageList = new LinkedList < Object > ( ) ;
public static void genGarbage ( ) {
for ( int i = 0 ; i < 32 * 1024 ; i + + ) {
garbageList . add ( new int [ 100 ] ) ;
}
garbageList . clear ( ) ;
}
// A large object referenced by a static.
static int [ ] filler = new int [ 10 * M ] ;
// Old gen object referencing the large object, generating remembered
// set entries.
static RefHolder fromOld = new RefHolder ( ) ;
public static void main ( String [ ] args ) {
int [ ] large = new int [ M ] ;
Object ref_from_stack = large ;
for ( int i = 0 ; i < 100 ; i + + ) {
// A large object that will be reclaimed eagerly.
large = new int [ 6 * M ] ;
fromOld . ref = large ;
genGarbage ( ) ;
}
// Keep the reference to the first object alive.
System . out . println ( ref_from_stack ) ;
}
}
public class TestEagerReclaimHumongousRegionsWithRefs {
public static void main ( String [ ] args ) throws Exception {
2024-01-05 09:12:24 +00:00
OutputAnalyzer output = ProcessTools . executeLimitedTestJava (
2015-01-07 14:15:37 +00:00
" -XX:+UseG1GC " ,
" -Xms128M " ,
" -Xmx128M " ,
" -Xmn16M " ,
2015-12-10 13:57:55 +00:00
" -Xlog:gc " ,
2019-01-28 14:53:56 +00:00
TestEagerReclaimHumongousRegionsWithRefsReclaimRegionFast . class . getName ( ) ) ;
2015-01-07 14:15:37 +00:00
Pattern p = Pattern . compile ( " Full GC " ) ;
int found = 0 ;
Matcher m = p . matcher ( output . getStdout ( ) ) ;
while ( m . find ( ) ) {
found + + ;
}
System . out . println ( " Issued " + found + " Full GCs " ) ;
assertLessThan ( found , 10 , " Found that " + found + " Full GCs were issued. This is larger than the bound. Eager reclaim of objects once referenced from old gen seems to not work at all " ) ;
output . shouldHaveExitValue ( 0 ) ;
}
}