https://bz.apache.org/bugzilla/show_bug.cgi?id=65177
Bug ID: 65177 Summary: org.apache.tomcat.util.net.TestSsl fails with OutOfMemoryError on 32-bit JVM Product: Tomcat 8 Version: 8.5.63 Hardware: PC Status: NEW Severity: normal Priority: P2 Component: Catalina Assignee: dev@tomcat.apache.org Reporter: knst.koli...@gmail.com Target Milestone: ---- Testing 8.5.64 release candidate, one unit test fails with OutOfMemoryError when running with a 32-bit JVM. It completes successfully with a 64-bit one. The failing test: org.apache.tomcat.util.net.TestSsl Testcase: testPost took 12,641 sec FAILED expected:<0> but was:<2> junit.framework.AssertionFailedError: expected:<0> but was:<2> at org.apache.tomcat.util.net.TestSsl.testPost(TestSsl.java:160) It fails in the same way with all 3 connectors. Here is an output from running with NIO connector and Java 7u80 (Oracle): [[[ 09-Mar-2021 08:42:25.819 INFO [main] org.apache.catalina.startup.LoggingBaseTest.setUp Starting test case [testPost] 09-Mar-2021 08:42:25.824 INFO [main] org.apache.coyote.AbstractProtocol.init Initializing ProtocolHandler ["https-jsse-nio-127.0.0.1-auto-3"] 09-Mar-2021 08:42:25.826 INFO [main] org.apache.tomcat.util.net.NioSelectorPool.getSharedSelector Using a shared selector for servlet write/read 09-Mar-2021 08:42:25.827 INFO [main] org.apache.catalina.core.StandardService.startInternal Starting service [Tomcat] 09-Mar-2021 08:42:25.827 INFO [main] org.apache.catalina.core.StandardEngine.startInternal Starting Servlet Engine: Apache Tomcat/8.5.64 09-Mar-2021 08:42:25.842 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["https-jsse-nio-127.0.0.1-auto-3-59015"] 09-Mar-2021 08:42:26.475 SEVERE [https-jsse-nio-127.0.0.1-auto-3-exec-5] org.apache.coyote.AbstractProtocol$ConnectionHandler.process Failed to complete processing of a request java.lang.OutOfMemoryError: Java heap space at java.io.ByteArrayOutputStream.<init>(ByteArrayOutputStream.java:77) at org.apache.tomcat.util.net.TestSsl$SimplePostServlet.doPost(TestSsl.java:300) at javax.servlet.http.HttpServlet.service(HttpServlet.java:652) at javax.servlet.http.HttpServlet.service(HttpServlet.java:733) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:544) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:364) at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:616) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:831) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1629) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:745) 09-Mar-2021 08:42:26.555 SEVERE [https-jsse-nio-127.0.0.1-auto-3-exec-6] org.apache.coyote.AbstractProtocol$ConnectionHandler.process Failed to complete processing of a request java.lang.OutOfMemoryError: Java heap space at java.io.ByteArrayOutputStream.<init>(ByteArrayOutputStream.java:77) at org.apache.tomcat.util.net.TestSsl$SimplePostServlet.doPost(TestSsl.java:300) at javax.servlet.http.HttpServlet.service(HttpServlet.java:652) at javax.servlet.http.HttpServlet.service(HttpServlet.java:733) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:544) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:364) at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:616) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:831) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1629) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:745) java.net.SocketException: Connection reset by peer: socket write error at java.net.SocketOutputStream.socketWrite0(Native Method) at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:113) at java.net.SocketOutputStream.write(SocketOutputStream.java:159) at sun.security.ssl.OutputRecord.writeBuffer(OutputRecord.java:377) at sun.security.ssl.OutputRecord.write(OutputRecord.java:363) at sun.security.ssl.SSLSocketImpl.writeRecordInternal(SSLSocketImpl.java:837) at sun.security.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.java:808) at sun.security.ssl.AppOutputStream.write(AppOutputStream.java:122) at org.apache.tomcat.util.net.TestSsl$1.run(TestSsl.java:117) java.net.SocketException: Connection reset by peer: socket write error at java.net.SocketOutputStream.socketWrite0(Native Method) at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:113) at java.net.SocketOutputStream.write(SocketOutputStream.java:159) at sun.security.ssl.OutputRecord.writeBuffer(OutputRecord.java:377) at sun.security.ssl.OutputRecord.write(OutputRecord.java:363) at sun.security.ssl.SSLSocketImpl.writeRecordInternal(SSLSocketImpl.java:837) at sun.security.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.java:808) at sun.security.ssl.AppOutputStream.write(AppOutputStream.java:122) at org.apache.tomcat.util.net.TestSsl$1.run(TestSsl.java:117) 09-Mar-2021 08:42:38.441 INFO [main] org.apache.coyote.AbstractProtocol.pause Pausing ProtocolHandler ["https-jsse-nio-127.0.0.1-auto-3-59015"] 09-Mar-2021 08:42:38.448 INFO [main] org.apache.catalina.core.StandardService.stopInternal Stopping service [Tomcat] 09-Mar-2021 08:42:38.451 INFO [main] org.apache.coyote.AbstractProtocol.stop Stopping ProtocolHandler ["https-jsse-nio-127.0.0.1-auto-3-59015"] 09-Mar-2021 08:42:38.456 INFO [main] org.apache.coyote.AbstractProtocol.destroy Destroying ProtocolHandler ["https-jsse-nio-127.0.0.1-auto-3-59015"] ]]] The failing line (TestSsl.java:300) does >300: ByteArrayOutputStream baos = new ByteArrayOutputStream(POST_DATA_SIZE); where POST_DATA_SIZE = 16 * 1024 * 1024, i.e. 16 Mb. The test runs 8 threads (iterations = 8), and each of them allocates 16 Mb on the sending side: >96: int iterations = 8; >109: byte[] bytes = new byte[POST_DATA_SIZE]; // 16MB and 16 Mb on the receiving side (the ByteArrayOutputStream above created in a servlet's method), i.e. 256 Mb total in byte arrays. Thus far I tested the following: 1) Running the test case alone, with the following setting in a build.properties file, fails in the same way: [[[ test.entry=org.apache.tomcat.util.net.TestSsl test.entry.methods=testPost ]]] 2) The test fails with 32-bit Java 7u80 from Oracle. 3) The test fails with 32-bit Java 8u202 from Oracle. 4) The test completes successfully with 64-bit Java 8u282 from AdoptOpenJDK. 5) If I change the ByteArrayOutputStream constructor call above to one without arguments, it fails at a different place - when growing an internal byte array: [[[ java.lang.OutOfMemoryError: Java heap space at java.util.Arrays.copyOf(Arrays.java:3236) at java.io.ByteArrayOutputStream.grow(ByteArrayOutputStream.java:118) at java.io.ByteArrayOutputStream.ensureCapacity(ByteArrayOutputStream.java:93) at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:153) at org.apache.tomcat.util.net.TestSsl$SimplePostServlet.doPost(TestSsl.java:306) ]]] 6) If I reduce the count of threads from 8 to 6 (changing 'iterations' on line 96), the test passes successfully. Thus a solution is to reduce the number of threads. Alternatively, it is possible to reuse the same array on the sending side. Those arrays could contain random data, but as of now they all have the same content: >110: Arrays.fill(bytes, (byte) 1); -- You are receiving this mail because: You are the assignee for the bug. --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org