{"id":9156,"date":"2022-02-16T17:40:33","date_gmt":"2022-02-16T20:40:33","guid":{"rendered":"https:\/\/www.fernandoquadro.com.br\/html\/?p=9156"},"modified":"2022-02-16T17:40:33","modified_gmt":"2022-02-16T20:40:33","slug":"ajustes-no-consumo-de-memoria-do-geoserver","status":"publish","type":"post","link":"https:\/\/www.fernandoquadro.com.br\/html\/2022\/02\/16\/ajustes-no-consumo-de-memoria-do-geoserver\/","title":{"rendered":"Ajustes no consumo de mem\u00f3ria do GeoServer"},"content":{"rendered":"<p>Prezados leitores,<\/p>\n<p>Hoje vou falar de um assunto que acredito que muitos passem, ajustar o GeoServer para que ele possa consumir o m\u00ednimo de mem\u00f3ria poss\u00edvel e voc\u00ea n\u00e3o ter que passar pelo erro <strong>OutOfMemory <\/strong>e correr o risco de deixar sua aplica\u00e7\u00e3o indispon\u00edvel ao usu\u00e1rio.<\/p>\n<p>O Java ele possibilita que voc\u00ea fa\u00e7a a limpeza da mem\u00f3ria atrav\u00e9s do Garbage Collector (GC), e o GC possui alguns algoritmos para te ajudar nesse trabalho.<\/p>\n<p><center><br \/>\n<img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2022\/02\/java-garbage-collector-550.png\" alt=\"\" width=\"550\" height=\"336\" class=\"aligncenter size-full wp-image-9159\" srcset=\"https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2022\/02\/java-garbage-collector-550.png 550w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2022\/02\/java-garbage-collector-550-300x183.png 300w\" sizes=\"auto, (max-width: 550px) 100vw, 550px\" \/><br \/>\n<\/center><\/p>\n<p>Eu vou falar nesse post, sobre o Garbage First Garbage Collector (G1GC), que \u00e9 um algoritmo de coleta de lixo adapt\u00e1vel que se tornou o algoritmo de GC padr\u00e3o desde o Java 9. Gostaria ent\u00e3o de compartilhar algumas dicas para ajustar o coletor de lixo G1 para obter um desempenho ideal. Se voc\u00ea quiser se aprofundar e entender melhor como \u00e9 o funcionamento do Garbage Collector, <a href=\"https:\/\/www.oracle.com\/webfolder\/technetwork\/tutorials\/obe\/java\/gc01\/index.html\" rel=\"noopener\" target=\"_blank\">basta clicar aqui<\/a>.<\/p>\n<p><strong>1. Tempo m\u00e1ximo de pausa do GC<\/strong><\/p>\n<p>Considere passar o argumento &#8216;-XX:MaxGCPauseMillis&#8217; com sua meta de tempo de pausa preferida. Este argumento define um valor de destino para o tempo m\u00e1ximo de pausa. O algoritmo G1 GC tenta o melhor para atingir esse objetivo.<\/p>\n<p><strong>2. Evite definir o tamanho da gera\u00e7\u00e3o jovem<\/strong><\/p>\n<p>Evite definir o tamanho da gera\u00e7\u00e3o jovem para um tamanho espec\u00edfico (passando os argumentos &#8216;-Xmn, -XX:NewRatio&#8217;). O algoritmo G1 GC modifica o tamanho da gera\u00e7\u00e3o jovem em tempo de execu\u00e7\u00e3o para atingir suas metas de tempo de pausa. Se o tamanho da gera\u00e7\u00e3o jovem for configurado explicitamente, as metas de tempo de pausa n\u00e3o ser\u00e3o alcan\u00e7adas.<\/p>\n<p><strong>3. Remova argumentos antigos<\/strong><\/p>\n<p>Quando voc\u00ea estiver migrando de outros algoritmos GC (CMS, Parallel, \u2026) para o algoritmo G1 GC, remova todos os argumentos JVM relacionados ao antigo algoritmo GC. Normalmente, passar argumentos antigos de algoritmos de GC para G1 n\u00e3o ter\u00e1 efeito ou pode at\u00e9 responder de maneira negativa.<\/p>\n<p><strong>4. Eliminando duplicatas de String<\/strong><\/p>\n<p>Devido a pr\u00e1ticas de programa\u00e7\u00e3o ineficientes, os aplicativos modernos desperdi\u00e7am muita mem\u00f3ria. Uma das principais raz\u00f5es para o desperd\u00edcio de mem\u00f3ria \u00e9 a duplica\u00e7\u00e3o de string. Um estudo recente indica que 13,5% da mem\u00f3ria do aplicativo cont\u00e9m strings duplicadas. G1 GC fornece uma op\u00e7\u00e3o para eliminar strings duplicadas quando voc\u00ea passa o argumento &#8216;-XX:+UseStringDeduplication&#8217;. Voc\u00ea pode considerar passar esse argumento para seu aplicativo se estiver executando o Java 8 atualiza\u00e7\u00e3o 20 e superior. Ele tem o potencial de melhorar o desempenho geral do aplicativo. Voc\u00ea pode saber mais sobre essa propriedade  neste artigo .<\/p>\n<p><strong>5. Entenda as configura\u00e7\u00f5es padr\u00e3o<\/strong><\/p>\n<p>Para fins de ajuste, na tabela abaixo, resumimos argumentos importantes do algoritmo G1 GC e seus valores padr\u00e3o: <\/p>\n<p><strong>-XX:MaxGCPauseMillis=200<\/strong> &#8211; Define um valor m\u00e1ximo de tempo de pausa. O valor padr\u00e3o \u00e9 200 milissegundos.<br \/>\n<strong>-XX:G1HeapRegionSize=n<\/strong> &#8211; Define o tamanho de uma regi\u00e3o G1. O valor deve ser pot\u00eancia de dois, ou seja, 256, 512, 1024,\u2026. Pode variar de 1 MB a 32 MB.<br \/>\n<strong>-XX:GCTimeRatio=12<\/strong> &#8211; Define o tempo total de destino que deve ser gasto no GC versus o tempo total a ser gasto no processamento de transa\u00e7\u00f5es do cliente. A f\u00f3rmula real para determinar o tempo de GC alvo \u00e9 [1 \/ (1 + GCTimeRatio)]. O valor padr\u00e3o 12 indica que o tempo alvo do GC \u00e9 [1 \/ (1 + 12)], ou seja, 7,69%. Isso significa que a JVM pode gastar 7,69% de seu tempo na atividade de GC e os 92,3% restantes devem ser gastos no processamento da atividade do cliente.<br \/>\n<strong>-XX:ParallelGCThreads=n<\/strong> &#8211; Define o n\u00famero de threads de trabalho Stop-the-world. Se houver menos ou igual a 8 processadores l\u00f3gicos, defina o valor de n para o n\u00famero de processadores l\u00f3gicos. Digamos que seu servidor tenha 5 processadores l\u00f3gicos, em seguida, defina n como 5. Se houver mais de oito processadores l\u00f3gicos, defina o valor de n para aproximadamente 5\/8 dos processadores l\u00f3gicos. Isso funciona na maioria dos casos, exceto para sistemas SPARC maiores, onde o valor de n pode ser aproximadamente 5\/16 dos processadores l\u00f3gicos.<br \/>\n<strong>-XX:ConcGCThreads=n<\/strong> &#8211; \tDefine o n\u00famero de linhas de marca\u00e7\u00e3o paralelas. Configura n para aproximadamente 1\/4 do n\u00famero de encadeamentos de coleta de lixo paralelo (ParallelGCThreads).<br \/>\n<strong>-XX:InitiatingHeapOccupancyPercent=45<\/strong> &#8211; Os ciclos de marca\u00e7\u00e3o GC s\u00e3o acionados quando o uso do heap ultrapassa essa porcentagem. O valor padr\u00e3o \u00e9 45%.<br \/>\n<strong>-XX:G1NewSizePercent=5<\/strong> &#8211; Define a porcentagem do heap a ser usada como o m\u00ednimo para o tamanho da gera\u00e7\u00e3o jovem. O valor padr\u00e3o \u00e9 5% do heap Java.<br \/>\n<strong>-XX:G1MaxNewSizePercent=60<\/strong> &#8211; Define a porcentagem do tamanho do heap a ser usado como o m\u00e1ximo para o tamanho da gera\u00e7\u00e3o jovem. O valor padr\u00e3o \u00e9 60 por cento de seu heap Java.<br \/>\n<strong>-XX:G1OldCSetRegionThresholdPercent=10<\/strong> &#8211; Define um limite superior no n\u00famero de regi\u00f5es antigas a serem coletadas durante um ciclo de coleta de lixo misto. O padr\u00e3o \u00e9 10% do heap Java.<br \/>\n<strong>-XX:G1ReservePercent=10<\/strong> &#8211; Define a porcentagem de mem\u00f3ria de reserva para manter livre. O padr\u00e3o \u00e9 10 por cento. Os coletores de lixo do G1 tentar\u00e3o manter 10% da pilha para estar sempre livre.<\/p>\n<p><strong>6. Estude as causas do GC<\/strong><\/p>\n<p>Uma das maneiras eficazes de otimizar o desempenho do G1 GC \u00e9 estudar as causas que desencadeiam o GC e fornecer solu\u00e7\u00f5es para reduzi-las. Aqui est\u00e3o os passos para estudar as causas do GC.<\/p>\n<p>6.1. Ative o log do GC. Ele pode ser ativado passando os seguintes argumentos da JVM para seu aplicativo durante o tempo de inicializa\u00e7\u00e3o:<\/p>\n<pre>\r\n-Xlog:gc*:file={file-path}\r\n<\/pre>\n<p>{file-path}: \u00e9 o local onde o arquivo de log do GC ser\u00e1 gravado<\/p>\n<p>6.2. Voc\u00ea pode analisar o arquivo de log do GC usando ferramentas gratuitas como  GCeasy ,  Garbage Cat ,  HP Jmeter . Essas ferramentas relatam os motivos que est\u00e3o acionando a atividade do GC.<\/p>\n<p><center><br \/>\n<img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2022\/02\/g1-gc-causes.png\" alt=\"\" width=\"1024\" height=\"448\" class=\"aligncenter size-full wp-image-9163\" srcset=\"https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2022\/02\/g1-gc-causes.png 1024w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2022\/02\/g1-gc-causes-300x131.png 300w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2022\/02\/g1-gc-causes-768x336.png 768w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2022\/02\/g1-gc-causes-600x263.png 600w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2022\/02\/g1-gc-causes-945x413.png 945w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><br \/>\n<\/center><\/p>\n<p>Agora \u00e9 com voc\u00ea. Espero que tenha gostado do post e que ele tenha sido \u00fatil.<\/p>\n<p>Fontes: <a href=\"https:\/\/www.oracle.com\/webfolder\/technetwork\/tutorials\/obe\/java\/gc01\/index.html\" rel=\"noopener\" target=\"_blank\">Oracle<\/a>, <a href=\"https:\/\/medium.com\/@hoan.nguyen.it\/how-did-g1gc-tuning-flags-affect-our-back-end-web-app-c121d38dfe56\" rel=\"noopener\" target=\"_blank\">Hoan Nguyen<\/a> e <a href=\"https:\/\/blog.gceasy.io\/2020\/06\/02\/simple-effective-g1-gc-tuning-tips\/\" rel=\"noopener\" target=\"_blank\">GCEasy<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Prezados leitores, Hoje vou falar de um assunto que acredito que muitos passem, ajustar o GeoServer para que ele possa consumir o m\u00ednimo de mem\u00f3ria poss\u00edvel e voc\u00ea n\u00e3o ter que passar pelo erro OutOfMemory e correr o risco de&#8230; <a class=\"more-link\" href=\"https:\/\/www.fernandoquadro.com.br\/html\/2022\/02\/16\/ajustes-no-consumo-de-memoria-do-geoserver\/\">Continue Reading &rarr;<\/a><\/p>\n","protected":false},"author":275,"featured_media":9158,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1,24],"tags":[208],"class_list":["post-9156","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-diversos","category-gis","tag-geoserver"],"_links":{"self":[{"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/posts\/9156","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/users\/275"}],"replies":[{"embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/comments?post=9156"}],"version-history":[{"count":12,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/posts\/9156\/revisions"}],"predecessor-version":[{"id":9172,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/posts\/9156\/revisions\/9172"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/media\/9158"}],"wp:attachment":[{"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/media?parent=9156"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/categories?post=9156"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/tags?post=9156"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}