{"id":481182,"date":"2026-05-27T07:28:31","date_gmt":"2026-05-27T07:28:31","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=481182"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=481182","title":{"rendered":"\u0428\u0451\u043b \u0437\u0430 \u0443\u0442\u0435\u0447\u043a\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438, \u043d\u0430\u0448\u0451\u043b \u0443\u0442\u0435\u0447\u043a\u0443 \u0434\u0438\u0441\u043a\u0430: SXSSFWorkbook \u0431\u0435\u0437 dispose() \u0432 Apache POI"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0418\u0433\u043e\u0440\u044c \u0421\u0438\u043c\u0430\u043a\u043e\u0432, \u0440\u0430\u0431\u043e\u0442\u0430\u044e engineering manager\u2019\u043e\u043c \u0438 \u0440\u0443\u043a\u043e\u0432\u043e\u0436\u0443 \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u043c\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438<\/p>\n<p>\u041d\u0430 \u043e\u0434\u043d\u043e\u043c \u0438\u0437 \u043d\u0430\u0448\u0438\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 XLSX-\u0444\u0430\u0439\u043b\u0430\u043c\u0438, \u043f\u0440\u0438\u043b\u0435\u0442\u0435\u043b production-\u0430\u043b\u0435\u0440\u0442 \u043d\u0430 \u0432\u044b\u0441\u043e\u043a\u043e\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u0438. \u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 P3, \u043e\u0431\u044b\u0447\u043d\u043e \u0440\u0435\u0448\u0430\u0435\u0442\u0441\u044f \u0440\u0435\u0441\u0442\u0430\u0440\u0442\u043e\u043c. \u041f\u043e\u0448\u0451\u043b \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043f\u043e\u0434\u044b \u0438 \u043d\u0430\u0448\u0451\u043b \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443, \u043a \u043f\u0430\u043c\u044f\u0442\u0438 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f \u043d\u0435 \u0438\u043c\u0435\u044e\u0449\u0443\u044e, \u043d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0443\u044e \u0431\u043e\u043b\u044c\u0448\u0438\u0439 \u0440\u0438\u0441\u043a, \u0447\u0435\u043c \u0441\u0430\u043c \u0430\u043b\u0435\u0440\u0442. \u041e\u0431 \u044d\u0442\u043e\u043c \u0438 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043d\u0438\u0436\u0435: \u0447\u0435\u043c \u00ab\u0443\u0442\u0435\u0447\u043a\u0430 \u0434\u0438\u0441\u043a\u0430\u00bb \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u00ab\u0443\u0442\u0435\u0447\u043a\u0438 \u043f\u0430\u043c\u044f\u0442\u0438\u00bb, \u043a\u0430\u043a \u043c\u044b \u043d\u0430\u0442\u043a\u043d\u0443\u043b\u0438\u0441\u044c \u043d\u0430 \u0433\u0440\u0430\u0431\u043b\u0438 \u0432 Apache POI \u0438 \u043a\u0430\u043a \u0437\u0430\u043a\u0440\u044b\u043b\u0438 \u0438\u0445 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b<\/p>\n<h3>\u0423\u0442\u0435\u0447\u043a\u0430 \u043f\u0430\u043c\u044f\u0442\u0438 \u0438 \u0443\u0442\u0435\u0447\u043a\u0430 \u0434\u0438\u0441\u043a\u0430: \u0432 \u0447\u0451\u043c \u0440\u0430\u0437\u043d\u0438\u0446\u0430<\/h3>\n<p>\u0412 \u043e\u0431\u043e\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u043b\u043e\u0433\u0438\u043a\u0430 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u0430\u044f: \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432\u044b\u0434\u0435\u043b\u0438\u043b\u043e \u0440\u0435\u0441\u0443\u0440\u0441 \u0438 \u043d\u0435 \u043e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u043b\u043e. \u0421\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u0440\u0430\u0441\u0445\u043e\u0434 \u0440\u0430\u0441\u0442\u0451\u0442, \u043f\u043e\u043a\u0430 \u043d\u0435 \u0443\u043f\u0440\u0451\u0442\u0441\u044f \u0432 \u043f\u043e\u0442\u043e\u043b\u043e\u043a<\/p>\n<p><strong>\u0423\u0442\u0435\u0447\u043a\u0430 \u043f\u0430\u043c\u044f\u0442\u0438.<\/strong> \u041e\u0431\u044a\u0435\u043a\u0442\u044b \u043a\u043e\u043f\u044f\u0442\u0441\u044f \u0432 \u043a\u0443\u0447\u0435 Java (heap) \u0438\u043b\u0438 \u0432 native-\u043f\u0430\u043c\u044f\u0442\u0438 \u0437\u0430 \u0435\u0451 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u043c\u0438 &#8212; direct buffers (\u043f\u0430\u043c\u044f\u0442\u044c \u0434\u043b\u044f \u0441\u0435\u0442\u0435\u0432\u043e\u0433\u043e I\/O \u0432 \u043e\u0431\u0445\u043e\u0434 heap), \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438, \u0441\u0442\u0435\u043a\u0438 \u043f\u043e\u0442\u043e\u043a\u043e\u0432. \u0421\u0441\u044b\u043b\u043a\u0430 \u0436\u0438\u0432\u0451\u0442 \u0442\u0430\u043c, \u0433\u0434\u0435 \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u0430, GC \u0435\u0451 \u043d\u0435 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442. \u041f\u0430\u043c\u044f\u0442\u044c \u043f\u043e\u0434\u0430 \u0440\u0430\u0441\u0442\u0451\u0442, \u0443\u043f\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0432 <code>limits.memory<\/code>, Kubernetes \u0434\u0435\u043b\u0430\u0435\u0442 OOMKill, \u043f\u043e\u0434 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f. \u041b\u043e\u043a\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430: \u0441\u0442\u0440\u0430\u0434\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0430\u043c \u0441\u0435\u0440\u0432\u0438\u0441, \u043b\u0435\u0447\u0438\u0442\u0441\u044f \u0440\u0435\u0441\u0442\u0430\u0440\u0442\u043e\u043c<\/p>\n<p><strong>\u0423\u0442\u0435\u0447\u043a\u0430 \u0434\u0438\u0441\u043a\u0430.<\/strong> \u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0444\u0430\u0439\u043b\u044b \u0438 \u043d\u0435 \u0443\u0434\u0430\u043b\u044f\u0435\u0442. \u0417\u0434\u0435\u0441\u044c \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435: \u0443\u043f\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u044d\u0442\u043e \u043d\u0435 \u0432 \u043f\u043e\u0442\u043e\u043b\u043e\u043a \u043f\u043e\u0434\u0430, \u0430 \u0432 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0435 \u043c\u0435\u0441\u0442\u043e \u043d\u0430 \u0434\u0438\u0441\u043a\u0435 \u043d\u043e\u0434\u044b. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e <code>\/tmp<\/code> \u0432 \u043f\u043e\u0434\u0435 &#8212; \u044d\u0442\u043e <code>emptyDir<\/code> \u0431\u0435\u0437 <code>sizeLimit<\/code>, \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u043d \u043b\u0435\u0436\u0438\u0442 \u043d\u0430 \u0434\u0438\u0441\u043a\u0435 \u043d\u043e\u0434\u044b (\u0442\u043e\u0442 \u0436\u0435 <code>\/dev\/vda2<\/code>, \u0433\u0434\u0435 \u0436\u0438\u0432\u0451\u0442 \u041e\u0421, container runtime, \u043b\u043e\u0433\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432). \u0423 \u043f\u043e\u0434\u0430 \u043b\u0438\u043c\u0438\u0442\u0430 \u043d\u0435\u0442, \u043e\u043d \u043f\u0438\u0448\u0435\u0442, \u043f\u043e\u043a\u0430 \u043c\u0435\u0441\u0442\u043e \u0435\u0441\u0442\u044c \u043d\u0430 \u043d\u043e\u0434\u0435. \u041a\u043e\u0433\u0434\u0430 \u043c\u0435\u0441\u0442\u043e \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f, <code>write()<\/code> \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 <code>ENOSPC<\/code>, \u0438 \u043f\u0430\u0434\u0430\u0435\u0442 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u0448 \u0441\u0435\u0440\u0432\u0438\u0441 &#8212; \u043f\u0430\u0434\u0430\u0435\u0442 \u0432\u0441\u0451, \u0447\u0442\u043e \u043f\u0438\u0448\u0435\u0442 \u043d\u0430 \u044d\u0442\u043e\u0442 \u0434\u0438\u0441\u043a, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0447\u0443\u0436\u0438\u0435 \u043f\u043e\u0434\u044b \u0438 kubelet<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">\n<\/th>\n<th>\n<p align=\"left\">\u0423\u0442\u0435\u0447\u043a\u0430 \u043f\u0430\u043c\u044f\u0442\u0438<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0423\u0442\u0435\u0447\u043a\u0430 \u0434\u0438\u0441\u043a\u0430 (host disk)<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u0413\u0434\u0435 \u043f\u0440\u0435\u0434\u0435\u043b<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>limits.memory<\/code> \u043f\u043e\u0434\u0430<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0435 \u043c\u0435\u0441\u0442\u043e \u043d\u0430 \u043d\u043e\u0434\u0435<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u0427\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u0440\u0438 \u0443\u043f\u043e\u0440\u0435<\/p>\n<\/td>\n<td>\n<p align=\"left\">OOMKill, \u043f\u043e\u0434 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f<\/p>\n<\/td>\n<td>\n<p align=\"left\">I\/O \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c ENOSPC<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u041a\u043e\u0433\u043e \u0437\u0430\u0434\u0435\u0432\u0430\u0435\u0442<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0430\u043c \u043f\u043e\u0434<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0432\u0441\u0435 \u043f\u043e\u0434\u044b \u043d\u0430 \u043d\u043e\u0434\u0435<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043b\u0435\u0447\u0435\u043d\u0438\u0435<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0434\u0430 (\u0440\u0435\u0441\u0442\u0430\u0440\u0442)<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043d\u0435\u0442<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u0423\u0442\u0435\u0447\u043a\u0430 \u043f\u0430\u043c\u044f\u0442\u0438 &#8212; \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0430\u044f: Kubernetes \u043e\u0442\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0435\u0451 \u0440\u0435\u0441\u0442\u0430\u0440\u0442\u043e\u043c. \u0423\u0442\u0435\u0447\u043a\u0430 \u0434\u0438\u0441\u043a\u0430 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u0430\u044f, \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0434\u0438\u0441\u043a \u043d\u043e\u0434\u044b \u043e\u0434\u0438\u043d \u043d\u0430 \u0432\u0441\u0435\u0445, \u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0435\u0433\u043e \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u00ab\u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u00bb<\/p>\n<blockquote>\n<p><strong>\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 RSS<\/strong><\/p>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u044f \u0431\u0443\u0434\u0443 \u043f\u0438\u0441\u0430\u0442\u044c \u00abRSS \u043f\u043e\u0434\u0430 = N MiB\u00bb. \u0420\u0430\u0441\u0448\u0438\u0444\u0440\u0443\u044e \u0441\u0440\u0430\u0437\u0443, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043e\u0442\u0432\u043b\u0435\u043a\u0430\u043b\u043e.<\/p>\n<p>RSS (Resident Set Size) \u2014 \u044d\u0442\u043e \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u043f\u0440\u044f\u043c\u043e \u0441\u0435\u0439\u0447\u0430\u0441. \u0421\u044e\u0434\u0430 \u0432\u0445\u043e\u0434\u0438\u0442 \u0432\u0441\u0451: JVM heap, non-heap (\u043c\u0435\u0442\u0430\u0441\u043f\u0435\u0439\u0441, code cache), native-\u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u0438 (direct buffers, \u043f\u0443\u043b\u044b Netty), \u0441\u0442\u0435\u043a\u0438 \u043f\u043e\u0442\u043e\u043a\u043e\u0432, \u0437\u0430\u043c\u0430\u043f\u043b\u0435\u043d\u043d\u044b\u0435 \u0432 \u043f\u0430\u043c\u044f\u0442\u044c \u0444\u0430\u0439\u043b\u044b<\/p>\n<p>\u0412\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043c\u043e\u0436\u0435\u0442 \u00ab\u0437\u0430\u0440\u0435\u0437\u0435\u0440\u0432\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u00bb \u0431\u043e\u043b\u044c\u0448\u0435, \u0447\u0435\u043c \u0435\u0441\u0442\u044c \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u0439. \u041d\u043e \u0432 RSS \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u043e, \u0447\u0442\u043e \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u043b\u0435\u0436\u0438\u0442 \u0432 RAM. \u0418\u043c\u0435\u043d\u043d\u043e RSS \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 <code>top<\/code> \u0432 \u043e\u0434\u043d\u043e\u0438\u043c\u0451\u043d\u043d\u043e\u0439 \u043a\u043e\u043b\u043e\u043d\u043a\u0435, \u0438 \u0438\u043c\u0435\u043d\u043d\u043e RSS Kubernetes \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u0442 \u0441 <code>limits.memory<\/code> \u043f\u043e\u0434\u0430, \u0447\u0442\u043e\u0431\u044b \u0440\u0435\u0448\u0438\u0442\u044c, \u043d\u0435 \u043f\u043e\u0440\u0430 \u043b\u0438 OOMKill<\/p>\n<\/blockquote>\n<blockquote>\n<p><strong>\u0427\u0435\u043c \u043c\u044b \u0438\u0437\u043c\u0435\u0440\u044f\u0435\u043c \u043f\u0430\u043c\u044f\u0442\u044c: \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0438 JVM<\/strong><\/p>\n<p>\u041f\u043e\u0434 \u00ab\u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0435\u043c \u043f\u0430\u043c\u044f\u0442\u0438\u00bb \u0432 Kubernetes \u043e\u0431\u044b\u0447\u043d\u043e \u0441\u043c\u0435\u0448\u0438\u0432\u0430\u044e\u0442 \u0434\u0432\u0430 \u0440\u0430\u0437\u043d\u044b\u0445 \u043d\u0430\u0431\u043e\u0440\u0430 \u043c\u0435\u0442\u0440\u0438\u043a. \u0420\u0430\u0437\u0432\u0435\u0434\u0443 \u0438\u0445 \u044f\u0432\u043d\u043e.<\/p>\n<p><strong>\u041c\u0435\u0442\u0440\u0438\u043a\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430.<\/strong> \u0421\u043e\u0431\u0438\u0440\u0430\u0435\u0442 <code>cAdvisor<\/code>, \u043e\u0442\u0434\u0430\u0451\u0442 \u0432 Prometheus. \u041a\u043b\u044e\u0447\u0435\u0432\u0430\u044f \u2014 <code>container_memory_working_set_bytes<\/code> (\u0433\u0440\u0443\u0431\u043e: RSS \u043f\u043e\u0434\u0430 \u043c\u0438\u043d\u0443\u0441 inactive file cache). \u041f\u043e \u043d\u0435\u0439 Kubernetes \u0440\u0435\u0448\u0430\u0435\u0442 \u0434\u0435\u043b\u0430\u0442\u044c OOMKill, \u0438 \u043f\u043e \u043d\u0435\u0439 \u0436\u0435 \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0438\u0442\u0441\u044f \u043d\u0430\u0448 \u0430\u043b\u0435\u0440\u0442 <code>PodMemoryHigh85<\/code> &#8212; <code>working_set \/ limits.memory &gt; 0.85<\/code>. \u041d\u043e\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u0438\u0434\u0451\u0442 \u0447\u0435\u0440\u0435\u0437 Alertmanager \u0432 Grafana OnCall<\/p>\n<p><strong>\u041c\u0435\u0442\u0440\u0438\u043a\u0438 JVM.<\/strong> Spring Boot Actuator + Micrometer \u043d\u0430 <code>\/actuator\/prometheus<\/code>. \u041f\u043e\u043b\u0435\u0437\u043d\u044b\u0435: <code>jvm.memory.used{area=\"heap\"}<\/code>, <code>jvm.memory.used{area=\"nonheap\"}<\/code> (\u043c\u0435\u0442\u0430\u0441\u043f\u0435\u0439\u0441, code cache), <code>jvm.gc.pause<\/code>. \u0412\u0438\u0434\u043d\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0430\u043c\u044f\u0442\u044c, \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 JVM. Direct buffers, \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0435 \u043b\u0438\u0431\u044b, \u0441\u0442\u0435\u043a\u0438 \u043f\u043e\u0442\u043e\u043a\u043e\u0432, OTel-\u0430\u0433\u0435\u043d\u0442 \u0434\u043b\u044f \u044d\u0442\u0438\u0445 \u043c\u0435\u0442\u0440\u0438\u043a \u043d\u0435\u0432\u0438\u0434\u0438\u043c\u044b<\/p>\n<p>\u0415\u0441\u043b\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0440\u0430\u0441\u0442\u0451\u0442, \u0430 heap \u0441\u0442\u043e\u0438\u0442, \u0442\u043e \u044d\u0442\u043e \u0443\u0442\u0435\u0447\u043a\u0430 \u0432 native-\u043f\u0430\u043c\u044f\u0442\u0438, <code>-Xmx<\/code> \u0442\u0443\u0442 \u043d\u0435 \u043f\u043e\u043c\u043e\u0436\u0435\u0442<\/p>\n<\/blockquote>\n<h3>\u0414\u0435\u043a\u043e\u0440\u0430\u0446\u0438\u0438<\/h3>\n<ul>\n<li>\n<p>Spring Boot 3, JDK 21, Apache POI 5.x<\/p>\n<\/li>\n<li>\n<p>\u0421\u0435\u0440\u0432\u0438\u0441 \u043e\u0442\u0434\u0430\u0451\u0442 \u043f\u0440\u043e\u0434\u0430\u0432\u0446\u0430\u043c XLSX-\u0448\u0430\u0431\u043b\u043e\u043d \u0441 \u0438\u0445 \u043e\u0441\u0442\u0430\u0442\u043a\u0430\u043c\u0438 \u0438 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u0439. \u0424\u0430\u0439\u043b\u044b \u0431\u044b\u0432\u0430\u044e\u0442 \u0431\u043e\u043b\u044c\u0448\u0438\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f <code>SXSSFWorkbook<\/code>, streaming-\u0432\u0430\u0440\u0438\u0430\u043d\u0442 POI: \u043e\u043d \u0434\u0435\u0440\u0436\u0438\u0442 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u043a\u043d\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445 N \u0441\u0442\u0440\u043e\u043a, \u0430 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u0434\u0438\u0441\u043a<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u043e\u0434: Kubernetes, \u0434\u0432\u0430 \u043f\u043e\u0434\u0430, <code>limits.memory=2Gi<\/code>, <code>requests.memory=512Mi<\/code>. <code>\/tmp<\/code> \u0441\u043c\u043e\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d \u043d\u0430 host disk, <strong>\u043d\u0435 tmpfs<\/strong><\/p>\n<\/li>\n<\/ul>\n<h3>\u0427\u0442\u043e \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u043e<\/h3>\n<p>\u0412 \u043f\u043e\u043d\u0435\u0434\u0435\u043b\u044c\u043d\u0438\u043a \u0432 05:41 UTC \u043f\u0440\u0438\u043b\u0435\u0442\u0435\u043b <code>PodMemoryHigh85<\/code> \u043d\u0430 \u043e\u0434\u043d\u043e\u043c \u0438\u0437 \u043f\u043e\u0434\u043e\u0432: RSS \u0432\u044b\u0448\u0435 85% \u043e\u0442 <code>limits.memory=2Gi<\/code><\/p>\n<p>\u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043f\u043e\u0434\u0430:<\/p>\n<ul>\n<li>\n<p>uptime 6 \u0441\u0443\u0442\u043e\u043a 4 \u0447\u0430\u0441\u0430, \u043d\u0435 \u0440\u0435\u0441\u0442\u0430\u0440\u0442\u0438\u043b\u0441\u044f;<\/p>\n<\/li>\n<li>\n<p>RSS 1731 MiB (84.5% \u043e\u0442 2Gi);<\/p>\n<\/li>\n<li>\n<p>JVM heap \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u0432\u0441\u0435\u0433\u043e 263 MiB, non-heap 327 MiB. \u0422\u043e \u0435\u0441\u0442\u044c \u043e\u043a\u043e\u043b\u043e 1.1 GiB RSS \u043b\u0435\u0436\u0438\u0442 <strong>\u0432\u043d\u0435<\/strong> JVM;<\/p>\n<\/li>\n<\/ul>\n<p>\u0422\u043e\u0442 \u0441\u0430\u043c\u044b\u0439 \u0440\u0430\u0437\u0440\u044b\u0432 \u043c\u0435\u0436\u0434\u0443 \u043c\u0435\u0442\u0440\u0438\u043a\u0430\u043c\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0438 \u043c\u0435\u0442\u0440\u0438\u043a\u0430\u043c\u0438 JVM, \u043f\u0440\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f \u043f\u0438\u0441\u0430\u043b \u0432\u044b\u0448\u0435: 1.1 GiB \u043b\u0435\u0436\u0438\u0442 \u0432\u043d\u0435 JVM, \u0438 actuator \u0435\u0433\u043e \u043d\u0435 \u0432\u0438\u0434\u0438\u0442. \u0427\u0442\u043e\u0431\u044b \u043f\u043e\u043d\u044f\u0442\u044c, \u043a\u0442\u043e \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e \u0435\u0441\u0442 \u043f\u0430\u043c\u044f\u0442\u044c, \u043d\u0443\u0436\u0435\u043d heap dump \u043f\u043b\u044e\u0441 \u0437\u043d\u0430\u043d\u0438\u0435 \u043f\u0440\u043e native-\u0430\u043b\u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b<\/p>\n<p>\u042f \u0441\u043d\u044f\u043b heap dump \u0447\u0435\u0440\u0435\u0437 <code>kubectl port-forward<\/code> + <code>jcmd<\/code>, \u043e\u0442\u043a\u0440\u044b\u043b \u0432 Eclipse MAT \u0438 \u043d\u0430\u0448\u0451\u043b \u0433\u043b\u0430\u0432\u043d\u043e\u0433\u043e \u0430\u043b\u043b\u043e\u043a\u0430\u0442\u043e\u0440\u0430 \u0437\u0430 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u043c\u0438 heap: Netty <code>PoolArena<\/code>, \u043f\u0443\u043b direct buffers \u0434\u043b\u044f \u0441\u0435\u0442\u0435\u0432\u043e\u0433\u043e I\/O. 21 \u0430\u0440\u0435\u043d\u0430 \u043f\u043e 16 MiB, \u043e\u043a\u043e\u043b\u043e 336 MiB. \u041f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0448\u0442\u0430\u0442\u043d\u043e\u0435: Netty \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0434\u0435\u043b\u0430\u0435\u0442 \u0430\u0440\u0435\u043d\u0443 \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 CPU, \u0430 \u0432 k8s <code>availableProcessors()<\/code> \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 21 \u044f\u0434\u0440\u043e \u043d\u043e\u0434\u044b. \u041b\u0435\u0447\u0438\u0442\u0441\u044f \u0444\u043b\u0430\u0433\u0430\u043c\u0438 <code>-Dio.netty.allocator.numDirectArenas=2 -XX:MaxDirectMemorySize=256m<\/code>. \u041e\u0444\u043e\u0440\u043c\u0438\u043b \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c action item &#8212; \u0432\u043e\u043f\u0440\u043e\u0441 \u0441 memory alert \u0437\u0430\u043a\u0440\u044b\u0442<\/p>\n<p>\u041d\u043e \u043f\u043e\u043a\u0430 \u043a\u043e\u043f\u0430\u043b\u0441\u044f \u0432 \u043f\u043e\u0434\u0435 \u0447\u0435\u0440\u0435\u0437 <code>kubectl exec<\/code>, \u043a\u0440\u0430\u0435\u043c \u0433\u043b\u0430\u0437\u0430 \u0437\u0430\u043c\u0435\u0442\u0438\u043b \u0441\u0442\u0440\u0430\u043d\u043d\u043e\u0435 \u0432 <code>du<\/code>. \u0412\u043e\u0442 \u043a\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043f\u0440\u043e\u0434\u0430 \u043f\u0440\u044f\u043c\u043e \u0441\u0435\u0439\u0447\u0430\u0441 (\u0444\u0438\u043a\u0441 \u0435\u0449\u0451 \u043d\u0430 \u0440\u0435\u0432\u044c\u044e, \u0431\u0430\u0433 \u0436\u0438\u0432\u0451\u0442):<\/p>\n<pre><code>$ kubectl -n pl-seller-storage-service exec seller-storage-service-...-fpznf -c app -- bash$ du -sh \/tmp\/poifiles1.9G    \/tmp\/poifiles$ ls \/tmp\/poifiles | wc -l10046$ ls -lh \/tmp\/poifiles | head -7total 1.9G-rw------- 1 10001 root  564K May 26 13:48 poi-sxssf-sheet10003417958849786613.xml-rw------- 1 10001 root  607K May 19 11:05 poi-sxssf-sheet10004469281468030521.xml-rw------- 1 10001 root  248K May 26 18:34 poi-sxssf-sheet10004610036281220997.xml-rw------- 1 10001 root  142K May 26 20:45 poi-sxssf-sheet10006089183010237705.xml-rw------- 1 10001 root     0 May 21 16:07 poi-sxssf-sheet10006300192782898050.xml-rw------- 1 10001 root     0 May 21 05:17 poi-sxssf-sheet10009984612842940696.xml$ df -h \/tmpFilesystem      Size  Used Avail Use% Mounted on\/dev\/vda2       367G  276G   76G  79% \/tmp<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:87px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u043e\u0447\u0442\u0438 2 GiB \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 \u043d\u0430 \u043e\u0434\u043d\u043e\u043c \u043f\u043e\u0434\u0435, \u043d\u0430 \u0432\u0442\u043e\u0440\u043e\u043c &#8212; 10103 \u0444\u0430\u0439\u043b\u0430, \u0442\u043e\u0436\u0435 1.9 GiB. \u0414\u043b\u044f \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0430: RSS \u043f\u043e\u0434\u0430 \u0432 \u044d\u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442 1.7 GiB, \u0442\u043e \u0435\u0441\u0442\u044c \u043d\u0430 \u0434\u0438\u0441\u043a\u0435 \u043f\u043e\u0434 \u0434\u0435\u0440\u0436\u0438\u0442 \u0434\u0430\u0436\u0435 \u0431\u043e\u043b\u044c\u0448\u0435, \u0447\u0435\u043c \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438. \u0424\u0430\u0439\u043b\u044b \u0434\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u043e\u0442 19 \u043c\u0430\u044f (\u0434\u0430\u0442\u0430 \u0441\u0442\u0430\u0440\u0442\u0430 uptime), \u0447\u0430\u0441\u0442\u044c \u043d\u0443\u043b\u0435\u0432\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430 &#8212; \u0441\u043b\u0435\u0434\u044b \u043d\u0435\u0437\u0430\u043a\u0440\u044b\u0442\u044b\u0445 workbook\u2019\u043e\u0432 \u043f\u043e\u0441\u043b\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439<\/p>\n<p>\u042f \u043f\u043e\u043d\u0430\u0431\u043b\u044e\u0434\u0430\u043b \u0435\u0449\u0451 \u0447\u0430\u0441: \u0441\u0447\u0451\u0442\u0447\u0438\u043a \u0440\u0430\u0441\u0442\u0451\u0442 \u043f\u043e \u043c\u0435\u0440\u0435 \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u0435\u0440\u0432\u0438\u0441\u0430. \u041a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437, \u043a\u043e\u0433\u0434\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 Excel, POI \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u043d\u043e\u0432\u044b\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u0438 \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0438\u0445 \u043d\u0430 \u0434\u0438\u0441\u043a\u0435. \u041f\u043e \u0434\u0430\u043d\u043d\u044b\u043c \u0441 \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0440\u0430\u0437\u0431\u043e\u0440\u0430 \u044d\u0442\u043e \u0434\u0430\u0451\u0442 \u043e\u043a\u043e\u043b\u043e 800 \u0444\u0430\u0439\u043b\u043e\u0432 \u0432 \u0441\u0443\u0442\u043a\u0438 \u043d\u0430 \u043f\u043e\u0434, \u0438\u043b\u0438 \u043f\u043e\u043b\u0433\u0438\u0433\u0430\u0431\u0430\u0439\u0442\u0430 \u0432 \u0441\u0443\u0442\u043a\u0438 \u043d\u0430 \u043d\u043e\u0434\u0443 \u043e\u0442 \u043e\u0434\u043d\u043e\u0433\u043e \u043d\u0430\u0448\u0435\u0433\u043e \u0441\u0435\u0440\u0432\u0438\u0441\u0430<\/p>\n<p>\u0418 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u0441\u0442\u0440\u043e\u0447\u043a\u0430 \u0432\u044b\u0432\u043e\u0434\u0430 <code>df -h \/tmp<\/code> \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u0447\u0442\u043e \u0434\u0438\u0441\u043a \u043d\u043e\u0434\u044b \u0443\u0436\u0435 \u043d\u0430 79% (76 GiB \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e \u0438\u0437 367 GiB). \u041d\u0430 \u0442\u043e\u0439 \u0436\u0435 \u043d\u043e\u0434\u0435 \u0436\u0438\u0432\u0443\u0442 \u0447\u0443\u0436\u0438\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u044b, \u0438 \u0447\u0430\u0441\u0442\u044c \u00ab\u0440\u0430\u0431\u043e\u0442\u044b\u00bb \u043f\u043e \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044e \u0434\u0438\u0441\u043a\u0430 \u0443\u0436\u0435 \u043d\u0430 \u043d\u0430\u0441. \u0422\u0443\u0442 P3 \u043d\u0430 \u0441\u0435\u0440\u0432\u0438\u0441 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 P1 \u043d\u0430 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443: \u0435\u0441\u043b\u0438 \u043d\u0430 \u043d\u043e\u0434\u0435 \u0436\u0438\u0432\u0443\u0442 \u0435\u0449\u0451 \u0434\u0435\u0441\u044f\u0442\u044c \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0438 \u043f\u0430\u0440\u0430 \u0438\u0437 \u043d\u0438\u0445 \u0442\u043e\u0436\u0435 \u00ab\u043f\u0440\u043e\u0442\u0435\u043a\u0430\u0435\u0442\u00bb, \u0434\u0438\u0441\u043a \u043a\u043e\u043d\u0447\u0430\u0435\u0442\u0441\u044f \u0437\u0430 \u0434\u043d\u0438 \u0438 \u043a\u043b\u0430\u0434\u0451\u0442 \u0432\u0441\u0435\u0445 \u0441\u043e\u0441\u0435\u0434\u0435\u0439<\/p>\n<h3>\u041f\u043e\u0447\u0435\u043c\u0443 SXSSFWorkbook.close() \u043d\u0435 \u0443\u0434\u0430\u043b\u044f\u0435\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b<\/h3>\n<p><code>SXSSFWorkbook<\/code> \u044d\u0442\u043e streaming-\u0432\u0430\u0440\u0438\u0430\u043d\u0442 POI \u0434\u043b\u044f \u0437\u0430\u043f\u0438\u0441\u0438 XLSX. \u0418\u0434\u0435\u044f \u043f\u0440\u043e\u0441\u0442\u0430\u044f: \u0432\u043c\u0435\u0441\u0442\u043e \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0432\u0435\u0441\u044c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438, \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 N \u0441\u0442\u0440\u043e\u043a \u0432 RAM, \u0430 \u0431\u043e\u043b\u0435\u0435 \u0441\u0442\u0430\u0440\u044b\u0435 \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u0432 \u0444\u0430\u0439\u043b\u044b <code>poi-sxssf-sheet*.xml<\/code> \u0432 <a href=\"http:\/\/java.io\" rel=\"noopener noreferrer nofollow\"><code>java.io<\/code><\/a><code>.tmpdir<\/code>. \u042d\u0442\u043e \u0434\u0430\u0451\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u0438\u0441\u0430\u0442\u044c XLSX \u043d\u0430 \u0441\u043e\u0442\u043d\u0438 \u0442\u044b\u0441\u044f\u0447 \u0441\u0442\u0440\u043e\u043a \u0431\u0435\u0437 OOM<\/p>\n<p>\u041f\u043e\u0434\u0432\u043e\u0445 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e <code>SXSSFWorkbook<\/code> \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 <code>AutoCloseable<\/code>. \u0422\u043e \u0435\u0441\u0442\u044c \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442, \u0447\u0442\u043e <code>try-with-resources<\/code> \u0441\u0434\u0435\u043b\u0430\u0435\u0442 \u0432\u0441\u0451 \u0441\u0430\u043c, \u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u0442\u043e\u0436\u0435 \u043f\u043e\u0434\u0447\u0438\u0441\u0442\u044f\u0442\u0441\u044f. \u041d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u043d\u0435\u0442<\/p>\n<blockquote>\n<p>\u0412 <a href=\"https:\/\/poi.apache.org\/apidocs\/dev\/org\/apache\/poi\/xssf\/streaming\/SXSSFWorkbook.html#dispose--\" rel=\"noopener noreferrer nofollow\">Javadoc Apache POI<\/a> \u044d\u0442\u043e \u0441\u043a\u0430\u0437\u0430\u043d\u043e \u043f\u0440\u044f\u043c\u043e:<\/p>\n<p>dispose() \u2014 Dispose of temporary files backing this workbook on disk. Calling this method will render the workbook unusable<\/p>\n<\/blockquote>\n<p><code>close()<\/code> \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 workbook, \u0434\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 ZIP-\u0441\u0442\u0440\u0438\u043c, \u043e\u0442\u0434\u0430\u0451\u0442 \u0440\u0435\u0441\u0443\u0440\u0441\u044b. \u0410 \u0432\u043e\u0442 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 sheet-\u0444\u0430\u0439\u043b\u043e\u0432 \u0441 \u0434\u0438\u0441\u043a\u0430 \u044d\u0442\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f, <code>dispose()<\/code>. \u0412 POI 5.x \u0432\u043d\u0443\u0442\u0440\u0438 <code>close()<\/code> <code>dispose()<\/code> \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0439 \u0432\u0435\u0442\u043a\u0435: \u0435\u0441\u043b\u0438 \u0437\u0430\u043f\u0438\u0441\u044c \u043f\u0440\u043e\u0448\u043b\u0430 \u0431\u0435\u0437 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439. \u0410 \u0435\u0441\u043b\u0438 \u043f\u043e\u0441\u0440\u0435\u0434\u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u0447\u0442\u043e-\u0442\u043e \u0443\u043f\u0430\u043b\u043e (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <code>IOException<\/code> \u043d\u0430 <code>OutputStream<\/code>), temps \u043e\u0441\u0442\u0430\u044e\u0442\u0441\u044f. \u041d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u0438\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u043e \u0438 \u043a\u043e\u043f\u0438\u0442\u0441\u044f \u0432 \u043f\u0440\u043e\u0434\u0435<\/p>\n<p>\u041d\u0430\u0448 \u0441\u0442\u0430\u0440\u044b\u0439 \u043a\u043e\u0434 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u043b \u043a\u0430\u043a \u043e\u0431\u0440\u0430\u0437\u0435\u0446 <code>try-with-resources<\/code>:<\/p>\n<pre><code class=\"java\">try (InputStream in = ...;     XSSFWorkbook template = new XSSFWorkbook(Objects.requireNonNull(in));     SXSSFWorkbook wb = new SXSSFWorkbook(template, ROW_ACCESS_WINDOW_SIZE)) {    wb.setCompressTempFiles(true);    \/\/ ... \u0437\u0430\u043f\u0438\u0441\u044c XLSX ...    wb.write(os);    os.flush();} catch (IOException e) {    log.error(\"XLSX write failed: {}\", e.getMessage(), e);    throw new ServiceException(FILE_GENERATION_FAILED, \"xlsx\");}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h3>\u0424\u0438\u043a\u0441<\/h3>\n<p><code>dispose()<\/code> \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u044f\u0432\u043d\u043e, \u0432 <code>finally<\/code>, \u0438 \u0434\u043e \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0437\u0430\u043a\u0440\u043e\u0435\u0442\u0441\u044f \u043e\u0431\u0451\u0440\u043d\u0443\u0442\u044b\u0439 <code>XSSFWorkbook<\/code>-template. \u0415\u0441\u043b\u0438 template \u0437\u0430\u043a\u0440\u043e\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0432\u044b\u043c, <code>dispose()<\/code> \u043c\u043e\u0436\u0435\u0442 \u0431\u0440\u043e\u0441\u0438\u0442\u044c <code>IllegalStateException<\/code>, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432\u043d\u0443\u0442\u0440\u0438 \u043e\u043d \u043b\u0435\u0437\u0435\u0442 \u0432 template \u0437\u0430 \u0441\u043f\u0438\u0441\u043a\u043e\u043c sheet\u2019\u043e\u0432. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u0432\u044b\u0442\u0430\u0449\u0438\u043b <code>SXSSFWorkbook<\/code> \u0438\u0437 <code>try-with-resources<\/code> \u0432 \u043e\u0431\u044b\u0447\u043d\u043e\u0435 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u0438 \u043e\u0431\u0435\u0440\u043d\u0443\u043b \u0432 \u0441\u0432\u043e\u0439 <code>try\/finally<\/code><\/p>\n<pre><code class=\"java\">@Override@SuppressWarnings(\"PMD.CloseResource\")public &lt;T&gt; void write(List&lt;T&gt; records, OutputStream os, Class&lt;T&gt; schemaClass) {    var xlsxProfile = xlsxProfileResolver.resolve(schemaClass);    try (InputStream in = Thread.currentThread().getContextClassLoader()             .getResourceAsStream(xlsxProfile.templatePath());         XSSFWorkbook template = new XSSFWorkbook(Objects.requireNonNull(in))) {        SXSSFWorkbook wb = new SXSSFWorkbook(template, ROW_ACCESS_WINDOW_SIZE);        try {            wb.setCompressTempFiles(true);            writeWorkbook(wb, records, schemaClass, xlsxProfile, os);        } finally {            disposeQuietly(wb);        }    } catch (IOException e) {        log.error(\"XLSX write failed: {}\", e.getMessage(), e);        throw new ServiceException(FILE_GENERATION_FAILED, \"xlsx\");    }}private static void disposeQuietly(SXSSFWorkbook wb) {    try {        wb.dispose();    } catch (Exception e) {        log.warn(\"SXSSFWorkbook dispose failed\", e);    }    try {        wb.close();    } catch (IOException e) {        log.warn(\"SXSSFWorkbook close failed\", e);    }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><code>dispose()<\/code> \u0438\u0434\u0451\u0442 \u043f\u0435\u0440\u0432\u044b\u043c: \u043e\u043d \u0443\u0434\u0430\u043b\u044f\u0435\u0442 sheet-temps. <code>close()<\/code> \u043f\u043e\u0442\u043e\u043c \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 zip-output. \u041e\u0431\u0430 \u0437\u0430\u0432\u0451\u0440\u043d\u0443\u0442\u044b \u0432 <code>try\/catch<\/code> \u0441 <code>log.warn<\/code> \u2014 \u0435\u0441\u043b\u0438 \u0438\u0437 <code>write()<\/code> \u0443\u0436\u0435 \u043b\u0435\u0442\u0438\u0442 <code>ServiceException<\/code>, \u043d\u0435 \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u043c\u0430\u0441\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e cleanup-\u043e\u0448\u0438\u0431\u043a\u043e\u0439<\/p>\n<h3>\u0422\u0435\u0441\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043b\u043e\u0432\u0438\u0442 \u0440\u0435\u0433\u0440\u0435\u0441\u0441<\/h3>\n<p>Apache POI \u0434\u0430\u0451\u0442 \u0443\u0434\u043e\u0431\u043d\u044b\u0439 \u0445\u0443\u043a: <code>TempFile.setTempFileCreationStrategy(...)<\/code>. \u0427\u0435\u0440\u0435\u0437 \u043d\u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u043c\u0435\u043d\u0438\u0442\u044c \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e, \u043a\u0443\u0434\u0430 POI \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b. \u0412 \u0442\u0435\u0441\u0442\u0435 \u044d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043d\u0430 <code>@TempDir<\/code> \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0447\u0442\u043e \u043f\u043e\u0441\u043b\u0435 <code>write()<\/code> \u0442\u0430\u043c \u043d\u0435 \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u043d\u0438\u0447\u0435\u0433\u043e \u0441 \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043e\u043c <code>poi-sxssf-sheet<\/code><\/p>\n<pre><code class=\"java\">class XlsxStreamingFileServiceTest extends BaseTest {    private static final String POI_SHEET_PREFIX = \"poi-sxssf-sheet\";    @Autowired    private XlsxStreamingFileService xlsxStreamingFileService;    @AfterEach    void restorePoiTempStrategy() {        TempFile.setTempFileCreationStrategy(            new DefaultTempFileCreationStrategy(new File(System.getProperty(\"java.io.tmpdir\")))        );    }    @Test    void writeShouldDisposePoiTempFilesAfterSuccess(@TempDir Path poiTempDir) throws IOException {        TempFile.setTempFileCreationStrategy(new DefaultTempFileCreationStrategy(poiTempDir.toFile()));        var records = List.of(\/* ... *\/);        xlsxStreamingFileService.write(records, new ByteArrayOutputStream(), MySchemaDto.class);        assertNoPoiSheetFilesLeft(poiTempDir);    }    @Test    void writeShouldDisposePoiTempFilesEvenIfOutputStreamFails(@TempDir Path poiTempDir) throws IOException {        TempFile.setTempFileCreationStrategy(new DefaultTempFileCreationStrategy(poiTempDir.toFile()));        var records = List.of(\/* ... *\/);        try (OutputStream failing = new OutputStream() {            @Override public void write(int b) throws IOException { throw new IOException(\"boom\"); }        }) {            assertThatThrownBy(() -&gt; xlsxStreamingFileService.write(records, failing, MySchemaDto.class))                .isInstanceOf(ServiceException.class);        }        assertNoPoiSheetFilesLeft(poiTempDir);    }    private static void assertNoPoiSheetFilesLeft(Path poiTempDir) throws IOException {        try (Stream&lt;Path&gt; walk = Files.walk(poiTempDir)) {            var leftover = walk                .filter(Files::isRegularFile)                .filter(p -&gt; p.getFileName().toString().startsWith(POI_SHEET_PREFIX))                .toList();            assertThat(leftover)                .as(\"POI streaming temp files must be deleted via SXSSFWorkbook.dispose() after write\")                .isEmpty();        }    }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0412\u0442\u043e\u0440\u043e\u0439 \u0442\u0435\u0441\u0442 \u044f \u0441\u0447\u0438\u0442\u0430\u044e \u0432\u0430\u0436\u043d\u0435\u0435 \u043f\u0435\u0440\u0432\u043e\u0433\u043e. \u041e\u043d \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043a\u0435\u0439\u0441, \u043a\u043e\u0433\u0434\u0430 <code>OutputStream.write(...)<\/code> \u0431\u0440\u043e\u0441\u0430\u0435\u0442 <code>IOException<\/code> \u043f\u043e\u0441\u0440\u0435\u0434\u0438 \u0437\u0430\u043f\u0438\u0441\u0438. \u0411\u0435\u0437 <code>dispose()<\/code> \u0432 <code>finally<\/code> \u0438\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u043e\u0442 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439 \u0438 \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u043b \u0444\u0430\u0439\u043b\u044b. \u041d\u0430 happy path \u0441\u0442\u0430\u0440\u044b\u0439 \u043a\u043e\u0434 \u0442\u043e\u0436\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u043b \u0431\u0435\u0437 \u043e\u0448\u0438\u0431\u043e\u043a, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u043f\u0440\u044f\u0442\u0430\u043b\u0430\u0441\u044c \u0438\u043c\u0435\u043d\u043d\u043e \u0432 exception-\u0432\u0435\u0442\u043a\u0435<\/p>\n<h3>\u0417\u0430\u0449\u0438\u0442\u0430 \u043e\u0442 \u0440\u0435\u0433\u0440\u0435\u0441\u0441\u0438\u0438 \u0447\u0435\u0440\u0435\u0437 ArchUnit<\/h3>\n<p>\u0422\u0435\u0441\u0442 \u0432\u044b\u0448\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043e\u0434\u0438\u043d \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 flow. \u041d\u043e <code>SXSSFWorkbook<\/code>&#8212; \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 POI, \u0438 \u0437\u0430\u0432\u0442\u0440\u0430 \u043a\u0442\u043e-\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0435\u0433\u043e \u0432 \u0434\u0440\u0443\u0433\u043e\u043c \u043c\u0435\u0441\u0442\u0435 \u0438 \u0441\u043d\u043e\u0432\u0430 \u043f\u043e\u043b\u0443\u0447\u0438\u0442 \u0443\u0442\u0435\u0447\u043a\u0443. \u042d\u0442\u043e \u0441\u043b\u0443\u0447\u0430\u0439 \u0434\u043b\u044f ArchUnit: \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043d\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043a\u043b\u0430\u0441\u0441 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0446\u0435\u043b\u0438\u043a\u043e\u043c, \u0430 \u043d\u0435 \u043e\u0434\u0438\u043d \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442<\/p>\n<pre><code class=\"java\">@ArchTeststatic final ArchRule SXSSF_WORKBOOK_USAGE_LIMITED_TO_FILE_PACKAGE =    noClasses()        .that().resideOutsideOfPackage(\"..file..\")        .should().dependOnClassesThat()        .haveFullyQualifiedName(\"org.apache.poi.xssf.streaming.SXSSFWorkbook\")        .because(\"SXSSFWorkbook \u0441\u043e\u0437\u0434\u0430\u0451\u0442 POI tmp-\u0444\u0430\u0439\u043b\u044b \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u043c tmp-dir \u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u044f\u0432\u043d\u043e\u0433\u043e dispose() \"            + \"\u0434\u043b\u044f \u0438\u0445 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f; \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0435\u0440\u0435\u0437 \u0441\u0435\u0440\u0432\u0438\u0441 \u0432 \u043f\u0430\u043a\u0435\u0442\u0435 ..file..\");<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u0435\u0440\u0435\u0432\u043e\u0434 \u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u0438\u0439: \u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u043a\u043b\u0430\u0441\u0441 \u0432\u043d\u0435 \u043f\u0430\u043a\u0435\u0442\u0430 <code>..file..<\/code> \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u043f\u0440\u0430\u0432\u0430 \u0437\u0430\u0432\u0438\u0441\u0435\u0442\u044c \u043e\u0442 <code>SXSSFWorkbook<\/code>. \u0415\u0441\u043b\u0438 \u0437\u0430\u0432\u0442\u0440\u0430 \u043a\u0442\u043e-\u0442\u043e \u043d\u0430\u043f\u0438\u0448\u0435\u0442 <code>new SXSSFWorkbook(...)<\/code> \u0432 \u0434\u0440\u0443\u0433\u043e\u043c \u043c\u0435\u0441\u0442\u0435, \u0431\u0438\u043b\u0434 \u0443\u043f\u0430\u0434\u0451\u0442 \u0441 \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435\u043c. \u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0440\u0435\u0448\u0438\u0442\u0441\u044f \u043d\u0430 \u0440\u0435\u0432\u044c\u044e \u0437\u0430 \u043f\u044f\u0442\u044c \u043c\u0438\u043d\u0443\u0442, \u0430 \u043d\u0435 \u0447\u0435\u0440\u0435\u0437 \u0448\u0435\u0441\u0442\u044c \u0441\u0443\u0442\u043e\u043a uptime \u043d\u0430 \u043f\u0440\u043e\u0434\u0435<\/p>\n<p>\u041b\u043e\u0433\u0438\u043a\u0430 \u043e\u0431\u0449\u0430\u044f: \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u043d\u0430\u0448\u0451\u043b \u043d\u0435\u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u0433\u0440\u0430\u0431\u043b\u0438 \u0432 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435, \u0437\u0430\u043a\u0440\u0435\u043f\u0438 \u0437\u0430\u043f\u0440\u0435\u0442 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b. \u0422\u0435\u0441\u0442 \u043d\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 flow \u0438 ArchUnit-\u043f\u0440\u0430\u0432\u0438\u043b\u043e &#8212; \u0434\u0432\u0430 \u0440\u0430\u0437\u043d\u044b\u0445 \u0443\u0440\u043e\u0432\u043d\u044f \u0437\u0430\u0449\u0438\u0442\u044b, \u0438 \u043e\u043d\u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u044f\u044e\u0442 \u0434\u0440\u0443\u0433 \u0434\u0440\u0443\u0433\u0430, \u0430 \u043d\u0435 \u0434\u0443\u0431\u043b\u0438\u0440\u0443\u044e\u0442<\/p>\n<h3>\u0427\u0442\u043e \u0431\u044b \u044f \u0441\u0434\u0435\u043b\u0430\u043b \u043f\u043e-\u0434\u0440\u0443\u0433\u043e\u043c\u0443<\/h3>\n<ul>\n<li>\n<p>\u041f\u0440\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e <code>\/tmp<\/code> \u0432 Kubernetes \u044f \u0443\u0437\u043d\u0430\u043b, \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u0433\u0434\u0430 \u043f\u043e\u043b\u0435\u0437 \u043a\u043e\u043f\u0430\u0442\u044c \u0443\u0442\u0435\u0447\u043a\u0443. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e <code>emptyDir<\/code> \u2014-\u044d\u0442\u043e \u0434\u0438\u0441\u043a \u043d\u043e\u0434\u044b, \u0430 tmpfs \u043d\u0443\u0436\u043d\u043e \u0432\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u044f\u0432\u043d\u043e \u0447\u0435\u0440\u0435\u0437 <code>medium: Memory<\/code>. \u0421\u0442\u043e\u0438\u0442 \u0437\u0430\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0442\u044c \u044d\u0442\u043e \u0432 Pod spec \u043e\u0441\u043e\u0437\u043d\u0430\u043d\u043d\u043e, \u043d\u0435 \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u00ab\u043a\u0430\u043a-\u043d\u0438\u0431\u0443\u0434\u044c \u0441\u043b\u043e\u0436\u0438\u0442\u0441\u044f\u00bb<\/p>\n<\/li>\n<li>\n<p>\u0410\u043b\u0435\u0440\u0442 \u043d\u0430 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0435 \u043c\u0435\u0441\u0442\u043e \u043d\u0430 \u0434\u0438\u0441\u043a\u0435 \u043d\u043e\u0434\u044b \u0443 \u043d\u0430\u0441 \u0431\u044b\u043b, \u043d\u043e \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0438\u043b\u0441\u044f \u043d\u0430 90%. \u0414\u043b\u044f \u0440\u043e\u0441\u0442\u0430 250 MiB \u0432 \u0441\u0443\u0442\u043a\u0438 \u044d\u0442\u043e \u0434\u0430\u0451\u0442 \u043c\u0430\u043b\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043d\u0430 \u0440\u0435\u0430\u043a\u0446\u0438\u044e &#8212; \u0441\u0442\u043e\u0438\u0442 \u043f\u043e\u043d\u0438\u0437\u0438\u0442\u044c \u043f\u043e\u0440\u043e\u0433<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u043b\u0435\u0437\u043d\u043e \u0438\u043c\u0435\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u043c\u0435\u0442\u0440\u0438\u043a\u0443 \u043f\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0443 <code>emptyDir<\/code> \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u043e\u0434\u0430 (cAdvisor \u0443\u043c\u0435\u0435\u0442). \u0422\u043e\u0433\u0434\u0430 \u0443\u0442\u0435\u0447\u043a\u0430 \u043b\u043e\u0432\u0438\u0442\u0441\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u043e\u0442 RSS, \u0438 \u0441\u0440\u0430\u0437\u0443 \u0432\u0438\u0434\u043d\u043e, \u043d\u0430 \u043a\u0430\u043a\u043e\u043c \u0441\u0435\u0440\u0432\u0438\u0441\u0435 \u043e\u043d\u0430 \u043a\u043e\u043f\u0438\u0442\u0441\u044f, \u0430 \u043d\u0435 \u00ab\u0434\u0438\u0441\u043a \u043d\u043e\u0434\u044b \u0440\u0430\u0441\u0442\u0451\u0442, \u0438\u0449\u0438\u0442\u0435 \u0432\u0438\u043d\u043e\u0432\u0430\u0442\u043e\u0433\u043e\u00bb<\/p>\n<\/li>\n<\/ul>\n<h3>\u0418\u0442\u043e\u0433\u0438<\/h3>\n<ul>\n<li>\n<p><code>SXSSFWorkbook.close()<\/code> \u0432 Apache POI \u043d\u0435 \u0443\u0434\u0430\u043b\u044f\u0435\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 sheet-\u0444\u0430\u0439\u043b\u044b. \u042d\u0442\u043e \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043f\u043e \u0434\u043e\u043a\u0435, \u0430 \u043d\u0435 \u0431\u0430\u0433 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438. \u041d\u0443\u0436\u0435\u043d \u044f\u0432\u043d\u044b\u0439 <code>dispose()<\/code> \u0432 <code>finally<\/code><\/p>\n<\/li>\n<li>\n<p><code>try-with-resources<\/code> \u043d\u0435 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442 cleanup, \u0435\u0441\u043b\u0438 \u0443 \u043a\u043b\u0430\u0441\u0441\u0430 \u0432 \u0446\u0435\u043f\u043e\u0447\u043a\u0435 \u00ab\u0437\u0430\u043a\u0440\u044b\u0442\u0438\u0435\u00bb \u0438 \u00ab\u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0435\u043d\u0438\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432\u00bb &#8212; \u0440\u0430\u0437\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438<\/p>\n<\/li>\n<li>\n<p>\u0412 Kubernetes <code>\/tmp<\/code> \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043b\u0435\u0436\u0438\u0442 \u043d\u0430 \u0434\u0438\u0441\u043a\u0435 \u043d\u043e\u0434\u044b. \u0423\u0442\u0435\u0447\u043a\u0430 \u0434\u0438\u0441\u043a\u0430 \u043e\u0434\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u0430 \u0441\u0442\u0430\u0432\u0438\u0442 \u043f\u043e\u0434 \u0443\u0433\u0440\u043e\u0437\u0443 \u0432\u0441\u0435\u0445 \u0441\u043e\u0441\u0435\u0434\u0435\u0439 \u043f\u043e \u043d\u043e\u0434\u0435. \u042d\u0442\u043e \u0441\u0438\u043b\u044c\u043d\u043e \u043c\u0435\u043d\u044f\u0435\u0442 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442 \u0442\u0430\u043a\u0438\u0445 \u0431\u0430\u0433\u043e\u0432<\/p>\n<\/li>\n<li>\n<p>\u0415\u0441\u043b\u0438 \u043d\u0430\u0448\u0451\u043b \u043d\u0435\u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0433\u0432\u043e\u0437\u0434\u044c \u0432 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435, \u0438\u043c\u0435\u0435\u0442 \u0441\u043c\u044b\u0441\u043b \u0437\u0430\u043a\u0440\u0435\u043f\u0438\u0442\u044c \u0437\u0430\u043f\u0440\u0435\u0442 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 ArchUnit. \u042d\u0442\u043e \u0441\u0438\u043b\u044c\u043d\u0435\u0435, \u0447\u0435\u043c \u0442\u0435\u0441\u0442 \u043d\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 flow<\/p>\n<\/li>\n<\/ul>\n<\/div>\n<p>\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/1039862\/\">https:\/\/habr.com\/ru\/articles\/1039862\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0418\u0433\u043e\u0440\u044c \u0421\u0438\u043c\u0430\u043a\u043e\u0432, \u0440\u0430\u0431\u043e\u0442\u0430\u044e engineering manager\u2019\u043e\u043c \u0438 \u0440\u0443\u043a\u043e\u0432\u043e\u0436\u0443 \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u043c\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438\u041d\u0430 \u043e\u0434\u043d\u043e\u043c \u0438\u0437 \u043d\u0430\u0448\u0438\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 XLSX-\u0444\u0430\u0439\u043b\u0430\u043c\u0438, \u043f\u0440\u0438\u043b\u0435\u0442\u0435\u043b production-\u0430\u043b\u0435\u0440\u0442 \u043d\u0430 \u0432\u044b\u0441\u043e\u043a\u043e\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u0438. \u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 P3, \u043e\u0431\u044b\u0447\u043d\u043e \u0440\u0435\u0448\u0430\u0435\u0442\u0441\u044f \u0440\u0435\u0441\u0442\u0430\u0440\u0442\u043e\u043c. \u041f\u043e\u0448\u0451\u043b \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043f\u043e\u0434\u044b \u0438 \u043d\u0430\u0448\u0451\u043b \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443, \u043a \u043f\u0430\u043c\u044f\u0442\u0438 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f \u043d\u0435 \u0438\u043c\u0435\u044e\u0449\u0443\u044e, \u043d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0443\u044e \u0431\u043e\u043b\u044c\u0448\u0438\u0439 \u0440\u0438\u0441\u043a, \u0447\u0435\u043c \u0441\u0430\u043c \u0430\u043b\u0435\u0440\u0442. \u041e\u0431 \u044d\u0442\u043e\u043c \u0438 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043d\u0438\u0436\u0435: \u0447\u0435\u043c \u00ab\u0443\u0442\u0435\u0447\u043a\u0430 \u0434\u0438\u0441\u043a\u0430\u00bb \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u00ab\u0443\u0442\u0435\u0447\u043a\u0438 \u043f\u0430\u043c\u044f\u0442\u0438\u00bb, \u043a\u0430\u043a \u043c\u044b \u043d\u0430\u0442\u043a\u043d\u0443\u043b\u0438\u0441\u044c \u043d\u0430 \u0433\u0440\u0430\u0431\u043b\u0438 \u0432 Apache POI \u0438 \u043a\u0430\u043a \u0437\u0430\u043a\u0440\u044b\u043b\u0438 \u0438\u0445 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b\u0423\u0442\u0435\u0447\u043a\u0430 \u043f\u0430\u043c\u044f\u0442\u0438 \u0438 \u0443\u0442\u0435\u0447\u043a\u0430 \u0434\u0438\u0441\u043a\u0430: \u0432 \u0447\u0451\u043c \u0440\u0430\u0437\u043d\u0438\u0446\u0430\u0412 \u043e\u0431\u043e\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u043b\u043e\u0433\u0438\u043a\u0430 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u0430\u044f: \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432\u044b\u0434\u0435\u043b\u0438\u043b\u043e \u0440\u0435\u0441\u0443\u0440\u0441 \u0438 \u043d\u0435 \u043e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u043b\u043e. \u0421\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u0440\u0430\u0441\u0445\u043e\u0434 \u0440\u0430\u0441\u0442\u0451\u0442, \u043f\u043e\u043a\u0430 \u043d\u0435 \u0443\u043f\u0440\u0451\u0442\u0441\u044f \u0432 \u043f\u043e\u0442\u043e\u043b\u043e\u043a\u0423\u0442\u0435\u0447\u043a\u0430 \u043f\u0430\u043c\u044f\u0442\u0438. \u041e\u0431\u044a\u0435\u043a\u0442\u044b \u043a\u043e\u043f\u044f\u0442\u0441\u044f \u0432 \u043a\u0443\u0447\u0435 Java (heap) \u0438\u043b\u0438 \u0432 native-\u043f\u0430\u043c\u044f\u0442\u0438 \u0437\u0430 \u0435\u0451 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u043c\u0438 &#8212; direct buffers (\u043f\u0430\u043c\u044f\u0442\u044c \u0434\u043b\u044f \u0441\u0435\u0442\u0435\u0432\u043e\u0433\u043e I\/O \u0432 \u043e\u0431\u0445\u043e\u0434 heap), \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438, \u0441\u0442\u0435\u043a\u0438 \u043f\u043e\u0442\u043e\u043a\u043e\u0432. \u0421\u0441\u044b\u043b\u043a\u0430 \u0436\u0438\u0432\u0451\u0442 \u0442\u0430\u043c, \u0433\u0434\u0435 \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u0430, GC \u0435\u0451 \u043d\u0435 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442. \u041f\u0430\u043c\u044f\u0442\u044c \u043f\u043e\u0434\u0430 \u0440\u0430\u0441\u0442\u0451\u0442, \u0443\u043f\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0432 limits.memory, Kubernetes \u0434\u0435\u043b\u0430\u0435\u0442 OOMKill, \u043f\u043e\u0434 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f. \u041b\u043e\u043a\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430: \u0441\u0442\u0440\u0430\u0434\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0430\u043c \u0441\u0435\u0440\u0432\u0438\u0441, \u043b\u0435\u0447\u0438\u0442\u0441\u044f \u0440\u0435\u0441\u0442\u0430\u0440\u0442\u043e\u043c\u0423\u0442\u0435\u0447\u043a\u0430 \u0434\u0438\u0441\u043a\u0430. \u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0444\u0430\u0439\u043b\u044b \u0438 \u043d\u0435 \u0443\u0434\u0430\u043b\u044f\u0435\u0442. \u0417\u0434\u0435\u0441\u044c \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435: \u0443\u043f\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u044d\u0442\u043e \u043d\u0435 \u0432 \u043f\u043e\u0442\u043e\u043b\u043e\u043a \u043f\u043e\u0434\u0430, \u0430 \u0432 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0435 \u043c\u0435\u0441\u0442\u043e \u043d\u0430 \u0434\u0438\u0441\u043a\u0435 \u043d\u043e\u0434\u044b. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \/tmp \u0432 \u043f\u043e\u0434\u0435 &#8212; \u044d\u0442\u043e emptyDir \u0431\u0435\u0437 sizeLimit, \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u043d \u043b\u0435\u0436\u0438\u0442 \u043d\u0430 \u0434\u0438\u0441\u043a\u0435 \u043d\u043e\u0434\u044b (\u0442\u043e\u0442 \u0436\u0435 \/dev\/vda2, \u0433\u0434\u0435 \u0436\u0438\u0432\u0451\u0442 \u041e\u0421, container runtime, \u043b\u043e\u0433\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432). \u0423 \u043f\u043e\u0434\u0430 \u043b\u0438\u043c\u0438\u0442\u0430 \u043d\u0435\u0442, \u043e\u043d \u043f\u0438\u0448\u0435\u0442, \u043f\u043e\u043a\u0430 \u043c\u0435\u0441\u0442\u043e \u0435\u0441\u0442\u044c \u043d\u0430 \u043d\u043e\u0434\u0435. \u041a\u043e\u0433\u0434\u0430 \u043c\u0435\u0441\u0442\u043e \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f, write() \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 ENOSPC, \u0438 \u043f\u0430\u0434\u0430\u0435\u0442 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u0448 \u0441\u0435\u0440\u0432\u0438\u0441 &#8212; \u043f\u0430\u0434\u0430\u0435\u0442 \u0432\u0441\u0451, \u0447\u0442\u043e \u043f\u0438\u0448\u0435\u0442 \u043d\u0430 \u044d\u0442\u043e\u0442 \u0434\u0438\u0441\u043a, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0447\u0443\u0436\u0438\u0435 \u043f\u043e\u0434\u044b \u0438 kubelet\u0423\u0442\u0435\u0447\u043a\u0430 \u043f\u0430\u043c\u044f\u0442\u0438\u0423\u0442\u0435\u0447\u043a\u0430 \u0434\u0438\u0441\u043a\u0430 (host disk)\u0413\u0434\u0435 \u043f\u0440\u0435\u0434\u0435\u043blimits.memory \u043f\u043e\u0434\u0430\u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0435 \u043c\u0435\u0441\u0442\u043e \u043d\u0430 \u043d\u043e\u0434\u0435\u0427\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u0440\u0438 \u0443\u043f\u043e\u0440\u0435OOMKill, \u043f\u043e\u0434 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044fI\/O \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c ENOSPC\u041a\u043e\u0433\u043e \u0437\u0430\u0434\u0435\u0432\u0430\u0435\u0442\u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0430\u043c \u043f\u043e\u0434\u0432\u0441\u0435 \u043f\u043e\u0434\u044b \u043d\u0430 \u043d\u043e\u0434\u0435\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043b\u0435\u0447\u0435\u043d\u0438\u0435\u0434\u0430 (\u0440\u0435\u0441\u0442\u0430\u0440\u0442)\u043d\u0435\u0442\u0423\u0442\u0435\u0447\u043a\u0430 \u043f\u0430\u043c\u044f\u0442\u0438 &#8212; \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0430\u044f: Kubernetes \u043e\u0442\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0435\u0451 \u0440\u0435\u0441\u0442\u0430\u0440\u0442\u043e\u043c. \u0423\u0442\u0435\u0447\u043a\u0430 \u0434\u0438\u0441\u043a\u0430 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u0430\u044f, \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0434\u0438\u0441\u043a \u043d\u043e\u0434\u044b \u043e\u0434\u0438\u043d \u043d\u0430 \u0432\u0441\u0435\u0445, \u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0435\u0433\u043e \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u00ab\u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u00bb\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 RSS\u0414\u0430\u043b\u044c\u0448\u0435 \u044f \u0431\u0443\u0434\u0443 \u043f\u0438\u0441\u0430\u0442\u044c \u00abRSS \u043f\u043e\u0434\u0430 = N MiB\u00bb. \u0420\u0430\u0441\u0448\u0438\u0444\u0440\u0443\u044e \u0441\u0440\u0430\u0437\u0443, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043e\u0442\u0432\u043b\u0435\u043a\u0430\u043b\u043e.RSS (Resident Set Size) \u2014 \u044d\u0442\u043e \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u043f\u0440\u044f\u043c\u043e \u0441\u0435\u0439\u0447\u0430\u0441. \u0421\u044e\u0434\u0430 \u0432\u0445\u043e\u0434\u0438\u0442 \u0432\u0441\u0451: JVM heap, non-heap (\u043c\u0435\u0442\u0430\u0441\u043f\u0435\u0439\u0441, code cache), native-\u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u0438 (direct buffers, \u043f\u0443\u043b\u044b Netty), \u0441\u0442\u0435\u043a\u0438 \u043f\u043e\u0442\u043e\u043a\u043e\u0432, \u0437\u0430\u043c\u0430\u043f\u043b\u0435\u043d\u043d\u044b\u0435 \u0432 \u043f\u0430\u043c\u044f\u0442\u044c \u0444\u0430\u0439\u043b\u044b\u0412\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043c\u043e\u0436\u0435\u0442 \u00ab\u0437\u0430\u0440\u0435\u0437\u0435\u0440\u0432\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u00bb \u0431\u043e\u043b\u044c\u0448\u0435, \u0447\u0435\u043c \u0435\u0441\u0442\u044c \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u0439. \u041d\u043e \u0432 RSS \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u043e, \u0447\u0442\u043e \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u043b\u0435\u0436\u0438\u0442 \u0432 RAM. \u0418\u043c\u0435\u043d\u043d\u043e RSS \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 top \u0432 \u043e\u0434\u043d\u043e\u0438\u043c\u0451\u043d\u043d\u043e\u0439 \u043a\u043e\u043b\u043e\u043d\u043a\u0435, \u0438 \u0438\u043c\u0435\u043d\u043d\u043e RSS Kubernetes \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u0442 \u0441 limits.memory \u043f\u043e\u0434\u0430, \u0447\u0442\u043e\u0431\u044b \u0440\u0435\u0448\u0438\u0442\u044c, \u043d\u0435 \u043f\u043e\u0440\u0430 \u043b\u0438 OOMKill\u0427\u0435\u043c \u043c\u044b \u0438\u0437\u043c\u0435\u0440\u044f\u0435\u043c \u043f\u0430\u043c\u044f\u0442\u044c: \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0438 JVM\u041f\u043e\u0434 \u00ab\u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0435\u043c \u043f\u0430\u043c\u044f\u0442\u0438\u00bb \u0432 Kubernetes \u043e\u0431\u044b\u0447\u043d\u043e \u0441\u043c\u0435\u0448\u0438\u0432\u0430\u044e\u0442 \u0434\u0432\u0430 \u0440\u0430\u0437\u043d\u044b\u0445 \u043d\u0430\u0431\u043e\u0440\u0430 \u043c\u0435\u0442\u0440\u0438\u043a. \u0420\u0430\u0437\u0432\u0435\u0434\u0443 \u0438\u0445 \u044f\u0432\u043d\u043e.\u041c\u0435\u0442\u0440\u0438\u043a\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430. \u0421\u043e\u0431\u0438\u0440\u0430\u0435\u0442 cAdvisor, \u043e\u0442\u0434\u0430\u0451\u0442 \u0432 Prometheus. \u041a\u043b\u044e\u0447\u0435\u0432\u0430\u044f \u2014 container_memory_working_set_bytes (\u0433\u0440\u0443\u0431\u043e: RSS \u043f\u043e\u0434\u0430 \u043c\u0438\u043d\u0443\u0441 inactive file cache). \u041f\u043e \u043d\u0435\u0439 Kubernetes \u0440\u0435\u0448\u0430\u0435\u0442 \u0434\u0435\u043b\u0430\u0442\u044c OOMKill, \u0438 \u043f\u043e \u043d\u0435\u0439 \u0436\u0435 \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0438\u0442\u0441\u044f \u043d\u0430\u0448 \u0430\u043b\u0435\u0440\u0442 PodMemoryHigh85 &#8212; working_set \/ limits.memory &gt; 0.85. \u041d\u043e\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u0438\u0434\u0451\u0442 \u0447\u0435\u0440\u0435\u0437 Alertmanager \u0432 Grafana OnCall\u041c\u0435\u0442\u0440\u0438\u043a\u0438 JVM. Spring Boot Actuator + Micrometer \u043d\u0430 \/actuator\/prometheus. \u041f\u043e\u043b\u0435\u0437\u043d\u044b\u0435: jvm.memory.used{area=&#187;heap&#187;}, jvm.memory.used{area=&#187;nonheap&#187;} (\u043c\u0435\u0442\u0430\u0441\u043f\u0435\u0439\u0441, code cache), jvm.gc.pause. \u0412\u0438\u0434\u043d\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0430\u043c\u044f\u0442\u044c, \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 JVM. Direct buffers, \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0435 \u043b\u0438\u0431\u044b, \u0441\u0442\u0435\u043a\u0438 \u043f\u043e\u0442\u043e\u043a\u043e\u0432, OTel-\u0430\u0433\u0435\u043d\u0442 \u0434\u043b\u044f \u044d\u0442\u0438\u0445 \u043c\u0435\u0442\u0440\u0438\u043a \u043d\u0435\u0432\u0438\u0434\u0438\u043c\u044b\u0415\u0441\u043b\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0440\u0430\u0441\u0442\u0451\u0442, \u0430 heap \u0441\u0442\u043e\u0438\u0442, \u0442\u043e \u044d\u0442\u043e \u0443\u0442\u0435\u0447\u043a\u0430 \u0432 native-\u043f\u0430\u043c\u044f\u0442\u0438, -Xmx \u0442\u0443\u0442 \u043d\u0435 \u043f\u043e\u043c\u043e\u0436\u0435\u0442\u0414\u0435\u043a\u043e\u0440\u0430\u0446\u0438\u0438Spring Boot 3, JDK 21, Apache POI 5.x\u0421\u0435\u0440\u0432\u0438\u0441 \u043e\u0442\u0434\u0430\u0451\u0442 \u043f\u0440\u043e\u0434\u0430\u0432\u0446\u0430\u043c XLSX-\u0448\u0430\u0431\u043b\u043e\u043d \u0441 \u0438\u0445 \u043e\u0441\u0442\u0430\u0442\u043a\u0430\u043c\u0438 \u0438 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u0439. \u0424\u0430\u0439\u043b\u044b \u0431\u044b\u0432\u0430\u044e\u0442 \u0431\u043e\u043b\u044c\u0448\u0438\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f SXSSFWorkbook, streaming-\u0432\u0430\u0440\u0438\u0430\u043d\u0442 POI: \u043e\u043d \u0434\u0435\u0440\u0436\u0438\u0442 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u043a\u043d\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445 N \u0441\u0442\u0440\u043e\u043a, \u0430 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u0434\u0438\u0441\u043a\u041f\u0440\u043e\u0434: Kubernetes, \u0434\u0432\u0430 \u043f\u043e\u0434\u0430, limits.memory=2Gi, requests.memory=512Mi. \/tmp \u0441\u043c\u043e\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d \u043d\u0430 host disk, \u043d\u0435 tmpfs\u0427\u0442\u043e \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u043e\u0412 \u043f\u043e\u043d\u0435\u0434\u0435\u043b\u044c\u043d\u0438\u043a \u0432 05:41 UTC \u043f\u0440\u0438\u043b\u0435\u0442\u0435\u043b PodMemoryHigh85 \u043d\u0430 \u043e\u0434\u043d\u043e\u043c \u0438\u0437 \u043f\u043e\u0434\u043e\u0432: RSS \u0432\u044b\u0448\u0435 85% \u043e\u0442 limits.memory=2Gi\u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043f\u043e\u0434\u0430:uptime 6 \u0441\u0443\u0442\u043e\u043a 4 \u0447\u0430\u0441\u0430, \u043d\u0435 \u0440\u0435\u0441\u0442\u0430\u0440\u0442\u0438\u043b\u0441\u044f;RSS 1731 MiB (84.5% \u043e\u0442 2Gi);JVM heap \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u0432\u0441\u0435\u0433\u043e 263 MiB, non-heap 327 MiB. \u0422\u043e \u0435\u0441\u0442\u044c \u043e\u043a\u043e\u043b\u043e 1.1 GiB RSS \u043b\u0435\u0436\u0438\u0442 \u0432\u043d\u0435 JVM;\u0422\u043e\u0442 \u0441\u0430\u043c\u044b\u0439 \u0440\u0430\u0437\u0440\u044b\u0432 \u043c\u0435\u0436\u0434\u0443 \u043c\u0435\u0442\u0440\u0438\u043a\u0430\u043c\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0438 \u043c\u0435\u0442\u0440\u0438\u043a\u0430\u043c\u0438 JVM, \u043f\u0440\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f \u043f\u0438\u0441\u0430\u043b \u0432\u044b\u0448\u0435: 1.1 GiB \u043b\u0435\u0436\u0438\u0442 \u0432\u043d\u0435 JVM, \u0438 actuator \u0435\u0433\u043e \u043d\u0435 \u0432\u0438\u0434\u0438\u0442. \u0427\u0442\u043e\u0431\u044b \u043f\u043e\u043d\u044f\u0442\u044c, \u043a\u0442\u043e \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e \u0435\u0441\u0442 \u043f\u0430\u043c\u044f\u0442\u044c, \u043d\u0443\u0436\u0435\u043d heap dump \u043f\u043b\u044e\u0441 \u0437\u043d\u0430\u043d\u0438\u0435 \u043f\u0440\u043e native-\u0430\u043b\u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b\u042f \u0441\u043d\u044f\u043b heap dump \u0447\u0435\u0440\u0435\u0437 kubectl port-forward + jcmd, \u043e\u0442\u043a\u0440\u044b\u043b \u0432 Eclipse MAT \u0438 \u043d\u0430\u0448\u0451\u043b \u0433\u043b\u0430\u0432\u043d\u043e\u0433\u043e \u0430\u043b\u043b\u043e\u043a\u0430\u0442\u043e\u0440\u0430 \u0437\u0430 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u043c\u0438 heap: Netty PoolArena, \u043f\u0443\u043b direct buffers \u0434\u043b\u044f \u0441\u0435\u0442\u0435\u0432\u043e\u0433\u043e I\/O. 21 \u0430\u0440\u0435\u043d\u0430 \u043f\u043e 16 MiB, \u043e\u043a\u043e\u043b\u043e 336 MiB. \u041f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0448\u0442\u0430\u0442\u043d\u043e\u0435: Netty \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0434\u0435\u043b\u0430\u0435\u0442 \u0430\u0440\u0435\u043d\u0443 \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 CPU, \u0430 \u0432 k8s availableProcessors() \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 21 \u044f\u0434\u0440\u043e \u043d\u043e\u0434\u044b. \u041b\u0435\u0447\u0438\u0442\u0441\u044f \u0444\u043b\u0430\u0433\u0430\u043c\u0438 -Dio.netty.allocator.numDirectArenas=2 -XX:MaxDirectMemorySize=256m. \u041e\u0444\u043e\u0440\u043c\u0438\u043b \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c action item &#8212; \u0432\u043e\u043f\u0440\u043e\u0441 \u0441 memory alert \u0437\u0430\u043a\u0440\u044b\u0442\u041d\u043e \u043f\u043e\u043a\u0430 \u043a\u043e\u043f\u0430\u043b\u0441\u044f \u0432 \u043f\u043e\u0434\u0435 \u0447\u0435\u0440\u0435\u0437 kubectl exec, \u043a\u0440\u0430\u0435\u043c \u0433\u043b\u0430\u0437\u0430 \u0437\u0430\u043c\u0435\u0442\u0438\u043b \u0441\u0442\u0440\u0430\u043d\u043d\u043e\u0435 \u0432 du. \u0412\u043e\u0442 \u043a\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043f\u0440\u043e\u0434\u0430 \u043f\u0440\u044f\u043c\u043e \u0441\u0435\u0439\u0447\u0430\u0441 (\u0444\u0438\u043a\u0441 \u0435\u0449\u0451 \u043d\u0430 \u0440\u0435\u0432\u044c\u044e, \u0431\u0430\u0433 \u0436\u0438\u0432\u0451\u0442):$ kubectl -n pl-seller-storage-service exec seller-storage-service-&#8230;-fpznf -c app &#8212; bash$ du -sh \/tmp\/poifiles1.9G    \/tmp\/poifiles$ ls \/tmp\/poifiles | wc -l10046$ ls -lh \/tmp\/poifiles | head -7total 1.9G-rw&#8212;&#8212;- 1 10001 root  564K May 26 13:48 poi-sxssf-sheet10003417958849786613.xml-rw&#8212;&#8212;- 1 10001 root  607K May 19 11:05 poi-sxssf-sheet10004469281468030521.xml-rw&#8212;&#8212;- 1 10001 root  248K May 26 18:34 poi-sxssf-sheet10004610036281220997.xml-rw&#8212;&#8212;- 1 10001 root  142K May 26 20:45 poi-sxssf-sheet10006089183010237705.xml-rw&#8212;&#8212;- 1 10001 root     0 May 21 16:07 poi-sxssf-sheet10006300192782898050.xml-rw&#8212;&#8212;- 1 10001 root     0 May 21 05:17 poi-sxssf-sheet10009984612842940696.xml$ df -h \/tmpFilesystem      Size  Used Avail Use% Mounted on\/dev\/vda2       367G  276G   76G  79% \/tmp\u041f\u043e\u0447\u0442\u0438 2 GiB \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 \u043d\u0430 \u043e\u0434\u043d\u043e\u043c \u043f\u043e\u0434\u0435, \u043d\u0430 \u0432\u0442\u043e\u0440\u043e\u043c &#8212; 10103 \u0444\u0430\u0439\u043b\u0430, \u0442\u043e\u0436\u0435 1.9 GiB. \u0414\u043b\u044f \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0430: RSS \u043f\u043e\u0434\u0430 \u0432 \u044d\u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442 1.7 GiB, \u0442\u043e \u0435\u0441\u0442\u044c \u043d\u0430 \u0434\u0438\u0441\u043a\u0435 \u043f\u043e\u0434 \u0434\u0435\u0440\u0436\u0438\u0442 \u0434\u0430\u0436\u0435 \u0431\u043e\u043b\u044c\u0448\u0435, \u0447\u0435\u043c \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438. \u0424\u0430\u0439\u043b\u044b \u0434\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u043e\u0442 19 \u043c\u0430\u044f (\u0434\u0430\u0442\u0430 \u0441\u0442\u0430\u0440\u0442\u0430 uptime), \u0447\u0430\u0441\u0442\u044c \u043d\u0443\u043b\u0435\u0432\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430 &#8212; \u0441\u043b\u0435\u0434\u044b \u043d\u0435\u0437\u0430\u043a\u0440\u044b\u0442\u044b\u0445 workbook\u2019\u043e\u0432 \u043f\u043e\u0441\u043b\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439\u042f \u043f\u043e\u043d\u0430\u0431\u043b\u044e\u0434\u0430\u043b \u0435\u0449\u0451 \u0447\u0430\u0441: \u0441\u0447\u0451\u0442\u0447\u0438\u043a \u0440\u0430\u0441\u0442\u0451\u0442 \u043f\u043e \u043c\u0435\u0440\u0435 \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u0435\u0440\u0432\u0438\u0441\u0430. \u041a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437, \u043a\u043e\u0433\u0434\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 Excel, POI \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u043d\u043e\u0432\u044b\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u0438 \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0438\u0445 \u043d\u0430 \u0434\u0438\u0441\u043a\u0435. \u041f\u043e \u0434\u0430\u043d\u043d\u044b\u043c \u0441 \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0440\u0430\u0437\u0431\u043e\u0440\u0430 \u044d\u0442\u043e \u0434\u0430\u0451\u0442 \u043e\u043a\u043e\u043b\u043e 800 \u0444\u0430\u0439\u043b\u043e\u0432 \u0432 \u0441\u0443\u0442\u043a\u0438 \u043d\u0430 \u043f\u043e\u0434, \u0438\u043b\u0438 \u043f\u043e\u043b\u0433\u0438\u0433\u0430\u0431\u0430\u0439\u0442\u0430 \u0432 \u0441\u0443\u0442\u043a\u0438 \u043d\u0430 \u043d\u043e\u0434\u0443 \u043e\u0442 \u043e\u0434\u043d\u043e\u0433\u043e \u043d\u0430\u0448\u0435\u0433\u043e \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u0418 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u0441\u0442\u0440\u043e\u0447\u043a\u0430 \u0432\u044b\u0432\u043e\u0434\u0430 df -h \/tmp \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u0447\u0442\u043e \u0434\u0438\u0441\u043a \u043d\u043e\u0434\u044b \u0443\u0436\u0435 \u043d\u0430 79% (76 GiB \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e \u0438\u0437 367 GiB). \u041d\u0430 \u0442\u043e\u0439 \u0436\u0435 \u043d\u043e\u0434\u0435 \u0436\u0438\u0432\u0443\u0442 \u0447\u0443\u0436\u0438\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u044b, \u0438 \u0447\u0430\u0441\u0442\u044c \u00ab\u0440\u0430\u0431\u043e\u0442\u044b\u00bb \u043f\u043e \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044e \u0434\u0438\u0441\u043a\u0430 \u0443\u0436\u0435 \u043d\u0430 \u043d\u0430\u0441. \u0422\u0443\u0442 P3 \u043d\u0430 \u0441\u0435\u0440\u0432\u0438\u0441 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 P1 \u043d\u0430 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443: \u0435\u0441\u043b\u0438 \u043d\u0430 \u043d\u043e\u0434\u0435 \u0436\u0438\u0432\u0443\u0442 \u0435\u0449\u0451 \u0434\u0435\u0441\u044f\u0442\u044c \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0438 \u043f\u0430\u0440\u0430 \u0438\u0437 \u043d\u0438\u0445 \u0442\u043e\u0436\u0435 \u00ab\u043f\u0440\u043e\u0442\u0435\u043a\u0430\u0435\u0442\u00bb, \u0434\u0438\u0441\u043a \u043a\u043e\u043d\u0447\u0430\u0435\u0442\u0441\u044f \u0437\u0430 \u0434\u043d\u0438 \u0438 \u043a\u043b\u0430\u0434\u0451\u0442 \u0432\u0441\u0435\u0445 \u0441\u043e\u0441\u0435\u0434\u0435\u0439\u041f\u043e\u0447\u0435\u043c\u0443 SXSSFWorkbook.close() \u043d\u0435 \u0443\u0434\u0430\u043b\u044f\u0435\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044bSXSSFWorkbook \u044d\u0442\u043e streaming-\u0432\u0430\u0440\u0438\u0430\u043d\u0442 POI \u0434\u043b\u044f \u0437\u0430\u043f\u0438\u0441\u0438 XLSX. \u0418\u0434\u0435\u044f \u043f\u0440\u043e\u0441\u0442\u0430\u044f: \u0432\u043c\u0435\u0441\u0442\u043e \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0432\u0435\u0441\u044c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438, \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 N \u0441\u0442\u0440\u043e\u043a \u0432 RAM, \u0430 \u0431\u043e\u043b\u0435\u0435 \u0441\u0442\u0430\u0440\u044b\u0435 \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u0432 \u0444\u0430\u0439\u043b\u044b poi-sxssf-sheet*.xml \u0432 java.io.tmpdir. \u042d\u0442\u043e \u0434\u0430\u0451\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u0438\u0441\u0430\u0442\u044c XLSX \u043d\u0430 \u0441\u043e\u0442\u043d\u0438 \u0442\u044b\u0441\u044f\u0447 \u0441\u0442\u0440\u043e\u043a \u0431\u0435\u0437 OOM\u041f\u043e\u0434\u0432\u043e\u0445 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e SXSSFWorkbook \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 AutoCloseable. \u0422\u043e \u0435\u0441\u0442\u044c \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442, \u0447\u0442\u043e try-with-resources \u0441\u0434\u0435\u043b\u0430\u0435\u0442 \u0432\u0441\u0451 \u0441\u0430\u043c, \u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u0442\u043e\u0436\u0435 \u043f\u043e\u0434\u0447\u0438\u0441\u0442\u044f\u0442\u0441\u044f. \u041d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u043d\u0435\u0442\u0412 Javadoc Apache POI \u044d\u0442\u043e \u0441\u043a\u0430\u0437\u0430\u043d\u043e \u043f\u0440\u044f\u043c\u043e:dispose() \u2014 Dispose of temporary files backing this workbook on disk. Calling this method will render the workbook unusableclose() \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 workbook, \u0434\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 ZIP-\u0441\u0442\u0440\u0438\u043c, \u043e\u0442\u0434\u0430\u0451\u0442 \u0440\u0435\u0441\u0443\u0440\u0441\u044b. \u0410 \u0432\u043e\u0442 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 sheet-\u0444\u0430\u0439\u043b\u043e\u0432 \u0441 \u0434\u0438\u0441\u043a\u0430 \u044d\u0442\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f, dispose(). \u0412 POI 5.x \u0432\u043d\u0443\u0442\u0440\u0438 close() dispose() \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0439 \u0432\u0435\u0442\u043a\u0435: \u0435\u0441\u043b\u0438 \u0437\u0430\u043f\u0438\u0441\u044c \u043f\u0440\u043e\u0448\u043b\u0430 \u0431\u0435\u0437 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439. \u0410 \u0435\u0441\u043b\u0438 \u043f\u043e\u0441\u0440\u0435\u0434\u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u0447\u0442\u043e-\u0442\u043e \u0443\u043f\u0430\u043b\u043e (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, IOException \u043d\u0430 OutputStream), temps \u043e\u0441\u0442\u0430\u044e\u0442\u0441\u044f. \u041d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u0438\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u043e \u0438 \u043a\u043e\u043f\u0438\u0442\u0441\u044f \u0432 \u043f\u0440\u043e\u0434\u0435\u041d\u0430\u0448 \u0441\u0442\u0430\u0440\u044b\u0439 \u043a\u043e\u0434 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u043b \u043a\u0430\u043a \u043e\u0431\u0440\u0430\u0437\u0435\u0446 try-with-resources:try (InputStream in = &#8230;;     XSSFWorkbook template = new XSSFWorkbook(Objects.requireNonNull(in));     SXSSFWorkbook wb = new SXSSFWorkbook(template, ROW_ACCESS_WINDOW_SIZE)) {    wb.setCompressTempFiles(true);    \/\/ &#8230; \u0437\u0430\u043f\u0438\u0441\u044c XLSX &#8230;    wb.write(os);    os.flush();} catch (IOException e) {    log.error(&#171;XLSX write failed: {}&#187;, e.getMessage(), e);    throw new ServiceException(FILE_GENERATION_FAILED, &#171;xlsx&#187;);}\u0424\u0438\u043a\u0441dispose() \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u044f\u0432\u043d\u043e, \u0432 finally, \u0438 \u0434\u043e \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0437\u0430\u043a\u0440\u043e\u0435\u0442\u0441\u044f \u043e\u0431\u0451\u0440\u043d\u0443\u0442\u044b\u0439 XSSFWorkbook-template. \u0415\u0441\u043b\u0438 template \u0437\u0430\u043a\u0440\u043e\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0432\u044b\u043c, dispose() \u043c\u043e\u0436\u0435\u0442 \u0431\u0440\u043e\u0441\u0438\u0442\u044c IllegalStateException, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432\u043d\u0443\u0442\u0440\u0438 \u043e\u043d \u043b\u0435\u0437\u0435\u0442 \u0432 template \u0437\u0430 \u0441\u043f\u0438\u0441\u043a\u043e\u043c sheet\u2019\u043e\u0432. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u0432\u044b\u0442\u0430\u0449\u0438\u043b SXSSFWorkbook \u0438\u0437 try-with-resources \u0432 \u043e\u0431\u044b\u0447\u043d\u043e\u0435 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u0438 \u043e\u0431\u0435\u0440\u043d\u0443\u043b \u0432 \u0441\u0432\u043e\u0439 try\/finally@Override@SuppressWarnings(&#171;PMD.CloseResource&#187;)public &lt;T&gt; void write(List&lt;T&gt; records, OutputStream os, Class&lt;T&gt; schemaClass) {    var xlsxProfile = xlsxProfileResolver.resolve(schemaClass);    try (InputStream in = Thread.currentThread().getContextClassLoader()             .getResourceAsStream(xlsxProfile.templatePath());         XSSFWorkbook template = new XSSFWorkbook(Objects.requireNonNull(in))) {        SXSSFWorkbook wb = new SXSSFWorkbook(template, ROW_ACCESS_WINDOW_SIZE);        try {            wb.setCompressTempFiles(true);            writeWorkbook(wb, records, schemaClass, xlsxProfile, os);        } finally {            disposeQuietly(wb);        }    } catch (IOException e) {        log.error(&#171;XLSX write failed: {}&#187;, e.getMessage(), e);        throw new ServiceException(FILE_GENERATION_FAILED, &#171;xlsx&#187;);    }}private static void disposeQuietly(SXSSFWorkbook wb) {    try {        wb.dispose();    } catch (Exception e) {        log.warn(&#171;SXSSFWorkbook dispose failed&#187;, e);    }    try {        wb.close();    } catch (IOException e) {        log.warn(&#171;SXSSFWorkbook close failed&#187;, e);    }}dispose() \u0438\u0434\u0451\u0442 \u043f\u0435\u0440\u0432\u044b\u043c: \u043e\u043d \u0443\u0434\u0430\u043b\u044f\u0435\u0442 sheet-temps. close() \u043f\u043e\u0442\u043e\u043c \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 zip-output. \u041e\u0431\u0430 \u0437\u0430\u0432\u0451\u0440\u043d\u0443\u0442\u044b \u0432 try\/catch \u0441 log.warn \u2014 \u0435\u0441\u043b\u0438&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-481182","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/481182","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=481182"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/481182\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=481182"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=481182"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=481182"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}