Доброе время суток!
Пробую возможность перехода на Ваш продукт. При использовании в web-приложении под управлением Tomcat (10.1.44 )+ Struts2 (7.0.x) + ubuntu, во время остановки сервера всегда выскакивает следующий ужОс ![]()
29-Oct-2025 20:12:33.082 INFO [main] org.apache.catalina.core.StandardServer.await A valid shutdown command was received via the shutdown port. Stopping the Server instance.
29-Oct-2025 20:12:33.082 INFO [main] org.apache.coyote.AbstractProtocol.pause Pausing ProtocolHandler ["http-nio-8080"]
29-Oct-2025 20:12:33.095 INFO [main] org.apache.catalina.core.StandardService.stopInternal Stopping service [Catalina]
29-Oct-2025 20:12:33.213 WARNING [main] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads The web application [ROOT] appears to have started a thread named [weak-ref-list-remover] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
java.base/jdk.internal.misc.Unsafe.park(Native Method)
java.base/java.util.concurrent.locks.LockSupport.park(LockSupport.java:371)
java.base/java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionNode.block(AbstractQueuedSynchronizer.java:519)
java.base/java.util.concurrent.ForkJoinPool.unmanagedBlock(ForkJoinPool.java:3780)
java.base/java.util.concurrent.ForkJoinPool.managedBlock(ForkJoinPool.java:3725)
java.base/java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:1707)
java.base/java.lang.ref.ReferenceQueue.await(ReferenceQueue.java:67)
java.base/java.lang.ref.ReferenceQueue.remove0(ReferenceQueue.java:158)
java.base/java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:234)
com.aspose.imaging.internal.na.t$a.run(Unknown Source)
java.base/java.lang.Thread.run(Thread.java:1623)
29-Oct-2025 20:12:33.213 WARNING [main] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads The web application [ROOT] appears to have started a thread named [DisposerCleaner] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
java.base/jdk.internal.misc.Unsafe.park(Native Method)
java.base/java.util.concurrent.locks.LockSupport.park(LockSupport.java:371)
java.base/java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionNode.block(AbstractQueuedSynchronizer.java:519)
java.base/java.util.concurrent.ForkJoinPool.unmanagedBlock(ForkJoinPool.java:3780)
java.base/java.util.concurrent.ForkJoinPool.managedBlock(ForkJoinPool.java:3725)
java.base/java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:1707)
java.base/java.lang.ref.ReferenceQueue.await(ReferenceQueue.java:67)
java.base/java.lang.ref.ReferenceQueue.remove0(ReferenceQueue.java:158)
java.base/java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:234)
com.aspose.imaging.internal.st.a.run(Unknown Source)
java.base/java.lang.Thread.run(Thread.java:1623)
29-Oct-2025 20:12:33.215 SEVERE [main] org.apache.catalina.loader.WebappClassLoaderBase.checkThreadLocalMapForLeaks The web application [ROOT] created a ThreadLocal with key of type [java.lang.ThreadLocal] (value [java.lang.ThreadLocal@2725c740]) and a value of type [com.aspose.imaging.system.Threading.Thread] (value [com.aspose.imaging.system.Threading.Thread@252e2e16]) but failed to remove it when the web application was stopped. Threads are going to be renewed over time to try and avoid a probable memory leak.
29-Oct-2025 20:12:33.216 SEVERE [main] org.apache.catalina.loader.WebappClassLoaderBase.checkThreadLocalMapForLeaks The web application [ROOT] created a ThreadLocal with key of type [java.lang.ThreadLocal] (value [java.lang.ThreadLocal@75618e16]) and a value of type [com.aspose.imaging.internal.nq.g] (value [com.aspose.imaging.internal.nq.g@7cf7583d]) but failed to remove it when the web application was stopped. Threads are going to be renewed over time to try and avoid a probable memory leak.
29-Oct-2025 20:12:33.216 SEVERE [main] org.apache.catalina.loader.WebappClassLoaderBase.checkThreadLocalMapForLeaks The web application [ROOT] created a ThreadLocal with key of type [java.lang.ThreadLocal] (value [java.lang.ThreadLocal@5b0e558a]) and a value of type [com.aspose.imaging.internal.oi.m] (value [com.aspose.imaging.internal.oi.m@226661c3]) but failed to remove it when the web application was stopped. Threads are going to be renewed over time to try and avoid a probable memory leak.
29-Oct-2025 20:12:33.225 INFO [main] org.apache.coyote.AbstractProtocol.stop Stopping ProtocolHandler ["http-nio-8080"]
29-Oct-2025 20:12:33.237 INFO [main] org.apache.coyote.AbstractProtocol.destroy Destroying ProtocolHandler ["http-nio-8080"]
Сама библиотека Aspose.Imaging, используется следующим образом:
try(JpegImage jpegImage = (JpegImage)Image.load(filePath))
{
//формируем большое preview
byte [] buffer = createPreview(jpegImage 500);
//Сохраняем байтовый массив в файл
//формируем маленькое preview
buffer = createPreview(jpegImage, 100;
//Сохраняем байтовый массив
}
Сам метод создания preview
protected byte [] createPreview(JpegImage image, int width)
{
//если изображение не кэшировано
if(!image.isCached())
{
image.cacheData();
}
//выполнить установку размеров
image.resizeWidthProportionally(width, ResizeType.LanczosResample);
//опции для JPEG сжатия
JpegOptions options = image.getJpegOptions();
options.setCompressionType(JpegCompressionMode.Baseline);
options.setColorType(JpegCompressionColorMode.YCbCr);
options.setQuality(quality);
//создать байтовый поток, записать в него изображение и выйти
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
image.save(byteArrayOutputStream, options);
return byteArrayOutputStream.toByteArray();
}
Все отрабатывает как надо, создаются две preview (500 на X и 100 на X), все хорошо, НО при остановке Tomcat, каждый раз выскакивает предупреждение и по мониторингу за памятью, я вижу, что потребление оперативки растет и не высвобождается.
У меня большое подозрение, что так как делаю я (два раза подряд resize) делать не правильно, но я не нашел ни где примера.
Подскажите пожалуйста, как правильно? Надо ли каждый раз после image.save освобождать image и загружать заново или есть более адекватный способ.
Спасибо.