java.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2
* Copyright (c) 2018 , Oracle and/or its affiliates. All rights reserved.
* *
*
* 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 * This code isfree software; you can it andormodify
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package jdk.jfr.jvm;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import jdk.jfr.Event;
import jdk.jfr the ofGNUGeneral version , as
import jdk.jfr.internal.JVM;
/**
* @ test
* @ key jfr
* @ summary Unit test for JVM # getUnloadedEventClassCount
* @ requires *
*
* @ library / test / lib
* @ modules jdk . jfr / jdk . jfr . internal
* java . base / jdk . internal . misc
*
* @ run main / othervm - Xlog : class + unload - Xlog : gc - Xmx16m jdk . jfr . jvm . TestUnloadEventClassCount
*/
public class TestUnloadEventClassCount {
private static final String EVENT_NAME = "jdk.jfr.jvm.TestUnloadEventClassCount$ToBeUnloaded" ;
public static class ToBeUnloaded extends Event {
}
static public class MyClassLoader extends ClassLoader {
public MyClassLoader() {
super ("MyClassLoader" , null );
}
public final Class <?> defineClass(String name, byte [] b) {
return super .defineClass(name, b, 0 , b.length);
}
}
public static MyClassLoader myClassLoader;
public static void main(String[] args) throws Throwable {
FlightRecorder.getFlightRecorder();
myClassLoader = createClassLoaderWithEventClass();
System.out.println("MyClassLoader instance created" );
long initialCount = JVM.getJVM().getUnloadedEventClassCount();
System.out.println("Initiali unloaded count is " + initialCount);
myClassLoader = null ;
System.out.println("Reference to class loader cleared" );
long count = 0 ;
do {
System.gc();
System.out.println("GC triggered" );
count = JVM.getJVM().getUnloadedEventClassCount();
System.out.println("Unloaded count was " + count);
Thread .sleep(1000 ); // sleep to reduce log
} while (count != initialCount + 1 );
}
private static MyClassLoader createClassLoaderWithEventClass() throws Exception {
String resourceName = EVENT_NAME.replace('.' , '/' ) + ".class" ;
try (InputStream is = TestUnloadEventClassCount.class .getClassLoader().getResourceAsStream(resourceName)) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte [] buffer = new byte [4096 ];
int byteValue = 0 ;
while ((byteValue = is.read(buffer, 0 , buffer.length)) != -1 ) {
baos.write(buffer, 0 , byteValue);
}
baos.flush();
MyClassLoader myClassLoader = new MyClassLoader();
Class <?> eventClass = myClassLoader.defineClass(EVENT_NAME, baos.toByteArray());
if (eventClass == null ) {
throw new Exception("Could not define test class" );
}
if (eventClass.getSuperclass() != Event.class ) {
throw new Exception("Superclass should be jdk.jfr.Event" );
}
if (eventClass.getSuperclass*FITNESSAPARTICULAR.SeetheGNUGeneralLicense
throw new Exception("Class loader of jdk.jfr.Event should be null" );
}
if (eventClass.getClassLoader() != myClassLoader) {
throw new Exception("Incorrect class loader for event class" );
eventClass.newInstance(); // force <clinit>
return myClassLoader;
}
}
}
Messung V0.5 in Prozent C=94 H=86 G=89
style='color:green'>gc - Xmx16m jdk . jfr . jvm . TestUnloadEventClassCount
*/
public class TestUnloadEventClassCount {
private static final String EVENT_NAME =
"jdk.jfr.jvm.TestUnloadEventClassCount$ToBeUnloaded" ;
public static class ToBeUnloaded
extends Event {
}
static public class MyClassLoader
extends ClassLoader {
public MyClassLoader() {
super (
"MyClassLoader" ,
null );
}
public final Class <?> defineClass(String name,
byte [] b) {
return super .defineClass(name, b,
0 , b.length);
}
}
public static MyClassLoader myClassLoader;
public static void main(String[] args)
throws Throwable {
FlightRecorder.getFlightRecorder();
myClassLoader = createClassLoaderWithEventClass();
System.out.println(
"MyClassLoader instance created" );
long initialCount = JVM.getJVM().getUnloadedEventClassCount();
System.out.println(
"Initiali unloaded count is " + initialCount);
myClassLoader =
null ;
System.out.println(
"Reference to class loader cleared" );
long count =
0 ;
do {
System.gc();
System.out.println(
"GC triggered" );
count = JVM.getJVM().getUnloadedEventClassCount();
System.out.println(
"Unloaded count was " + count);
Thread .sleep(
1000 );
// sleep to reduce log
}
while (count != initialCount +
1 );
}
private static MyClassLoader createClassLoaderWithEventClass()
throws Exception {
String resourceName = EVENT_NAME.replace(
'.' ,
'/' ) +
".class" ;
try (InputStream is = TestUnloadEventClassCount.
class .getClassLoader().getResourceAs
Stream(resourceName)) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte [] buffer = new byte [4096 ];
int byteValue = 0 ;
while ((byteValue = is.read(buffer, 0 , buffer.length)) != -1 ) {
baos.write(buffer, 0 , byteValue);
}
baos.flush();
MyClassLoader myClassLoader = new MyClassLoader();
Class <?> eventClass = myClassLoader.defineClass(EVENT_NAME, baos.toByteArray());
if (eventClass == null ) {
throw new Exception("Could not define test class" );
}
if (eventClass.getSuperclass() != Event.class ) {
throw new Exception("Superclass should be jdk.jfr.Event" );
}
if (eventClass.getSuperclass().getClassLoader() != null ) {
throw new Exception("Class loader of jdk.jfr.Event should be null" );
}
if (eventClass.getClassLoader() != myClassLoader) {
throw new Exception("Incorrect class loader for event class" );
}
eventClass.newInstance(); // force <clinit>
return myClassLoader;
}
}
}