Discussions
Categories
- 197.1K All Categories
- 2.5K Data
- 546 Big Data Appliance
- 1.9K Data Science
- 450.8K Databases
- 221.9K General Database Discussions
- 3.8K Java and JavaScript in the Database
- 31 Multilingual Engine
- 552 MySQL Community Space
- 479 NoSQL Database
- 7.9K Oracle Database Express Edition (XE)
- 3.1K ORDS, SODA & JSON in the Database
- 555 SQLcl
- 4K SQL Developer Data Modeler
- 187.2K SQL & PL/SQL
- 21.4K SQL Developer
- 296.3K Development
- 17 Developer Projects
- 139 Programming Languages
- 293K Development Tools
- 110 DevOps
- 3.1K QA/Testing
- 646.1K Java
- 28 Java Learning Subscription
- 37K Database Connectivity
- 158 Java Community Process
- 105 Java 25
- 22.1K Java APIs
- 138.2K Java Development Tools
- 165.3K Java EE (Java Enterprise Edition)
- 19 Java Essentials
- 162 Java 8 Questions
- 86K Java Programming
- 81 Java Puzzle Ball
- 65.1K New To Java
- 1.7K Training / Learning / Certification
- 13.8K Java HotSpot Virtual Machine
- 94.3K Java SE
- 13.8K Java Security
- 205 Java User Groups
- 24 JavaScript - Nashorn
- Programs
- 468 LiveLabs
- 39 Workshops
- 10.2K Software
- 6.7K Berkeley DB Family
- 3.5K JHeadstart
- 5.7K Other Languages
- 2.3K Chinese
- 175 Deutsche Oracle Community
- 1.1K Español
- 1.9K Japanese
- 233 Portuguese
Glassfish 4 HeapBuffer has already been disposed

Glassfish 4.0 Build 89
Apache/2.2.15
I have a servlet to provide images from our filestore. If an image is requested bigger than ~1.7Mb it is either truncated, corrupted, or missing. The status code of the request is always 200 OK.
The following stack trace occurs:
[2017-02-17T10:10:08.528+0000] [glassfish 4.0] [WARNING] [] [org.glassfish.grizzly.ProcessorExecutor] [tid: _ThreadID=45 _ThreadName=jk-connector(3)] [timeMillis: 1487326208528] [levelValue: 900] [[ Error during Processor execution. Connection=TCPNIOConnection{localSocketAddress={/127.0.0.1:8010}, peerSocketAddress={/127.0.0.1:57892}} ioEvent=WRITE [email protected]2d4f3a4java.lang.IllegalStateException: HeapBuffer has already been disposed at org.glassfish.grizzly.memory.HeapBuffer.checkDispose(HeapBuffer.java:802) at org.glassfish.grizzly.memory.HeapBuffer.position(HeapBuffer.java:188) at org.glassfish.grizzly.memory.BuffersBuffer.get(BuffersBuffer.java:881) at org.glassfish.grizzly.memory.BuffersBuffer.get(BuffersBuffer.java:59) at org.glassfish.grizzly.memory.BuffersBuffer.get(BuffersBuffer.java:869) at org.glassfish.grizzly.memory.BuffersBuffer.get(BuffersBuffer.java:842) at org.glassfish.grizzly.memory.BuffersBuffer.get(BuffersBuffer.java:59) at org.glassfish.grizzly.nio.transport.TCPNIOAsyncQueueWriter.fillByteBuffer(TCPNIOAsyncQueueWriter.java:206) at org.glassfish.grizzly.nio.transport.TCPNIOAsyncQueueWriter.writeComposite0(TCPNIOAsyncQueueWriter.java:151) at org.glassfish.grizzly.nio.transport.TCPNIOAsyncQueueWriter.write0(TCPNIOAsyncQueueWriter.java:80) at org.glassfish.grizzly.nio.AbstractNIOAsyncQueueWriter.processAsync(AbstractNIOAsyncQueueWriter.java:458) at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:110) at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77) at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:838) at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:113) at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:115) at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:55) at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:135) at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:564) at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:544) at java.lang.Thread.run(Thread.java:745)]]
Sample code snippet:
//String pathJpg derived from database call (not shown here) File file = new File(pathJpg); String mime = "image/jpeg"; response.setContentLengthLong(file.length()); response.setContentType(mime); FileInputStream in = new FileInputStream(file); try { byte[] buf = new byte[1024]; int count; while ((count = in.read(buf)) >= 0) { response.getOutputStream().write(buf); } } finally { in.close(); }
Calls to this servlet are being done via dynamically altering the src tag of an image upon clicking a button
Others have previous reported similar issues and it was registered as a bug, but it appears unresolved:
https://java.net/jira/browse/GLASSFISH-21192
Occurs irrespective of our Byte Buffer Type (Default DIRECT, but occurs with HEAP also) and irrespective of byte buffer sizes, chunking mode, compression or similar.
I have also tried replacing the grizzly jars in the Glassfish mq/lib folder with the latest versions - this also made no difference
I'm out of ideas, so any suggestions would be appreciated