-
Bug
-
Resolution: Fixed
-
P3
-
6u22, 7, 8, 11, 15, 16
-
b03
-
x86
-
linux
Issue | Fix Version | Assignee | Priority | Status | Resolution | Resolved In Build |
---|---|---|---|---|---|---|
JDK-8328537 | 21.0.4 | Alexandr Scherbatiy | P3 | Resolved | Fixed | b01 |
FULL PRODUCT VERSION :
java version "1.6.0_22"
Java(TM) SE Runtime Environment (build 1.6.0_22-b04)
ADDITIONAL OS VERSION INFORMATION :
Linux <user> 2.6.34.7-61.fc13.i686.PAE #1 SMP Tue Oct 19 04:24:06 UTC 2010 i686 i686 i386 GNU/Linux
EXTRA RELEVANT SYSTEM CONFIGURATION :
Cups version 1.4.4 with four printers installed
VM arguments:
-Xmx4m (reduce to get the OutOfMemoryError faster)
-XX:-HeapDumpOnOutOfMemoryError
A DESCRIPTION OF THE PROBLEM :
There is a memory leak in class sun.print.CustomMediaSizeName that can be forced by using the PrintService.addPrintServiceAttributeListener().
The constructor of class CustomMediaSizeName adds the name and itself into a static list. So with every creation the list gets bigger and bigger and will never be cleared.
Using the PrintService.addPrintServiceAttributeListener() always creates a set of ~60 instances of this class that will be added to the list.
Using a HashMap would solve this problem, because there is no need to have thousands of "A4" media size names in memory.
Source code (http://www.docjar.com/html/api/sun/print/CustomMediaSizeName.java.html):
class CustomMediaSizeName extends MediaSizeName {
private static ArrayList customStringTable = new ArrayList();
private static ArrayList customEnumTable = new ArrayList();
private String choiceName;
private MediaSizeName mediaName;
private CustomMediaSizeName(int x) {
super(x);
}
private synchronized static int nextValue(String name) {
customStringTable.add(name);
return (customStringTable.size()-1);
}
public CustomMediaSizeName(String name) {
super(nextValue(name));
customEnumTable.add(this);
choiceName = null;
mediaName = null;
}
....
}
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
see source code
REPRODUCIBILITY :
This bug can be reproduced always.
---------- BEGIN SOURCE ----------
package de.comsoft.cadas.tools;
import javax.print.DocFlavor;
import javax.print.PrintService;
import javax.print.PrintServiceLookup;
import javax.print.event.PrintServiceAttributeEvent;
import javax.print.event.PrintServiceAttributeListener;
public class TestCustomMediaSizeName
implements PrintServiceAttributeListener {
public static void main(final String[] args) {
final TestCustomMediaSizeName test = new TestCustomMediaSizeName();
test.run();
}
private void run() {
final PrintService[] services = PrintServiceLookup.lookupPrintServices(
DocFlavor.SERVICE_FORMATTED.PRINTABLE, null);
for (final PrintService printService : services) {
printService.addPrintServiceAttributeListener(this);
}
try {
Thread.sleep(Long.MAX_VALUE);
} catch (final InterruptedException ex) {
// TODO Auto-generated catch block
ex.printStackTrace();
}
}
public void attributeUpdate(final PrintServiceAttributeEvent pPsae) {
// nothing
}
}
---------- END SOURCE ----------
java version "1.6.0_22"
Java(TM) SE Runtime Environment (build 1.6.0_22-b04)
ADDITIONAL OS VERSION INFORMATION :
Linux <user> 2.6.34.7-61.fc13.i686.PAE #1 SMP Tue Oct 19 04:24:06 UTC 2010 i686 i686 i386 GNU/Linux
EXTRA RELEVANT SYSTEM CONFIGURATION :
Cups version 1.4.4 with four printers installed
VM arguments:
-Xmx4m (reduce to get the OutOfMemoryError faster)
-XX:-HeapDumpOnOutOfMemoryError
A DESCRIPTION OF THE PROBLEM :
There is a memory leak in class sun.print.CustomMediaSizeName that can be forced by using the PrintService.addPrintServiceAttributeListener().
The constructor of class CustomMediaSizeName adds the name and itself into a static list. So with every creation the list gets bigger and bigger and will never be cleared.
Using the PrintService.addPrintServiceAttributeListener() always creates a set of ~60 instances of this class that will be added to the list.
Using a HashMap would solve this problem, because there is no need to have thousands of "A4" media size names in memory.
Source code (http://www.docjar.com/html/api/sun/print/CustomMediaSizeName.java.html):
class CustomMediaSizeName extends MediaSizeName {
private static ArrayList customStringTable = new ArrayList();
private static ArrayList customEnumTable = new ArrayList();
private String choiceName;
private MediaSizeName mediaName;
private CustomMediaSizeName(int x) {
super(x);
}
private synchronized static int nextValue(String name) {
customStringTable.add(name);
return (customStringTable.size()-1);
}
public CustomMediaSizeName(String name) {
super(nextValue(name));
customEnumTable.add(this);
choiceName = null;
mediaName = null;
}
....
}
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
see source code
REPRODUCIBILITY :
This bug can be reproduced always.
---------- BEGIN SOURCE ----------
package de.comsoft.cadas.tools;
import javax.print.DocFlavor;
import javax.print.PrintService;
import javax.print.PrintServiceLookup;
import javax.print.event.PrintServiceAttributeEvent;
import javax.print.event.PrintServiceAttributeListener;
public class TestCustomMediaSizeName
implements PrintServiceAttributeListener {
public static void main(final String[] args) {
final TestCustomMediaSizeName test = new TestCustomMediaSizeName();
test.run();
}
private void run() {
final PrintService[] services = PrintServiceLookup.lookupPrintServices(
DocFlavor.SERVICE_FORMATTED.PRINTABLE, null);
for (final PrintService printService : services) {
printService.addPrintServiceAttributeListener(this);
}
try {
Thread.sleep(Long.MAX_VALUE);
} catch (final InterruptedException ex) {
// TODO Auto-generated catch block
ex.printStackTrace();
}
}
public void attributeUpdate(final PrintServiceAttributeEvent pPsae) {
// nothing
}
}
---------- END SOURCE ----------
- backported by
-
JDK-8328537 OutOfMemoryError by CustomMediaSizeName implementation
- Resolved