➟ What is Memory Leak?
The application is unintentionally holding references to objects, and this prevents the objects from being garbage collected. This is the Java language equivalent of a memory leak.
➟ What is String Pool? String pool (String intern pool) is a special storage area in Java heap. When a string is created and if the string already exists in the pool, the reference of the existing string will be returned, instead of creating a new object and returning its reference.
➤ Some Examples
• Both below are same. It will create new instance only if it is not available in pool, and then add in pool.
• Below line will create new instance each time.
➟ String.substring Method ➤ Before JDK 7 update 6
• String was using counter, offset variable for managing the operations like Substring.
• String was sharing same char[] of original String while calling substring method, thus original String was not eligible for GC.
• Substring method was fast compare to new version.
➤ After JDK 7 update 6
• Counter and offset variables has been removed from String class.
• String is not sharing char[] of original String while calling substring method.
• Substring method is slow compare to old version, because it will create new char[] for each call of substring.
➟ Changes done for String.substring method update in JDK 7u6 ➟ Memory Leak Bug Example in before JDK 7u6 (Source)
• A new optimization has been made that enables the G1 collector to identify strings which are duplicated more than once across your heap.
• It will handle it by pointing into the same internal char[] array.
• It will avoid multiple copies of the same string from residing inefficiently within the heap.
➟ What is String Pool? String pool (String intern pool) is a special storage area in Java heap. When a string is created and if the string already exists in the pool, the reference of the existing string will be returned, instead of creating a new object and returning its reference.
➤ Some Examples
• Both below are same. It will create new instance only if it is not available in pool, and then add in pool.
String s1 = "Vishal";
String s2 = new String("Vishal").intern();
• Below line will create new instance each time.
String s3 = new String("Vishal");
➟ String.substring Method ➤ Before JDK 7 update 6
• String was using counter, offset variable for managing the operations like Substring.
• String was sharing same char[] of original String while calling substring method, thus original String was not eligible for GC.
• Substring method was fast compare to new version.
➤ After JDK 7 update 6
• Counter and offset variables has been removed from String class.
• String is not sharing char[] of original String while calling substring method.
• Substring method is slow compare to old version, because it will create new char[] for each call of substring.
➟ Changes done for String.substring method update in JDK 7u6 ➟ Memory Leak Bug Example in before JDK 7u6 (Source)
public class TestGC {
private String largeString = new String(new byte[100000]);
String getSmallString() {
// if caller stores this substring, this object will not be gc'ed
return this.largeString.substring(0,2);
// return new String(this.largeString.substring(0,2)); // no error here!
}
public static void main(String[] args) {
java.util.ArrayList list = new java.util.ArrayList();
for (int i = 0; i < 1000000; i++) {
TestGC gc = new TestGC();
list.add(gc.getSmallString());
}
}
}
➟ Java 8 Update
➤ String Deduplication : • A new optimization has been made that enables the G1 collector to identify strings which are duplicated more than once across your heap.
• It will handle it by pointing into the same internal char[] array.
• It will avoid multiple copies of the same string from residing inefficiently within the heap.
No comments :
Post a Comment