{"id":404,"date":"2021-11-17T15:07:38","date_gmt":"2021-11-17T15:07:38","guid":{"rendered":"https:\/\/sidroniolima.com.br\/blog\/?p=404"},"modified":"2021-11-17T15:09:51","modified_gmt":"2021-11-17T15:09:51","slug":"effective-java-item-7-elimine-referencias-a-objetos-obsoletas","status":"publish","type":"post","link":"https:\/\/sidroniolima.com.br\/blog\/2021\/11\/17\/effective-java-item-7-elimine-referencias-a-objetos-obsoletas\/","title":{"rendered":"Effective Java &#8211; Item 7 &#8211; Elimine refer\u00eancias obsoletas a objetos"},"content":{"rendered":"\n<div class=\"twitter-share\"><a href=\"https:\/\/twitter.com\/intent\/tweet?via=sidroniolima\" class=\"twitter-share-button\">Tweet<\/a><\/div>\n\n<p>Gerenciamento de mem\u00f3ria em linguagens com Java, que possuem mecanismo de coleta de lixo, ou garbage collection mechanism, podem evitar problemas de perda de mem\u00f3ria, ou &#8220;<em>memory leaks<\/em>&#8220;.<\/p>\n\n\n\n<p>As &#8220;<em>Memory Leaks<\/em>&#8221; ocorrem quando objetos que j\u00e1 n\u00e3o s\u00e3o utilizados ainda ocupam espa\u00e7o na mem\u00f3ria. Esses objetos est\u00e3o no Heap e suas vari\u00e1veis na Stack, no caso do Java.<\/p>\n\n\n\n<p>N\u00e3o \u00e9 por haver um mecanismo de coleta de lixo que o programador n\u00e3o deva se preocupar com problemas de mem\u00f3ria que um c\u00f3digo, at\u00e9 mesmo um simples, pode causar.<\/p>\n\n\n\n<p>Perdas de mem\u00f3ria podem gerar uma <em>OutOfMemoryError<\/em> mas o maior problema \u00e9 que, na maioria da vezes, ela ocorre de forma silienciosa. E apenas podem ser descobertas com uma inspe\u00e7\u00e3o minuciosa do c\u00f3digo e com o aux\u00edlio de ferramentas de debugging, conhecidas como &#8220;<em>heap profiler<\/em>&#8220;.<\/p>\n\n\n\n<p>A classe abaixo armazena um array de objetos, permite o push e o pop de elementos e a cada push, dobra de tamanho.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ Can you spot the \"memory leak\"?\npublic class Stack {\nprivate Object&#91;] elements;\nprivate int size = 0;\nprivate static final int DEFAULT_INITIAL_CAPACITY = 16;public Stack() {\nelements = new Object&#91;DEFAULT_INITIAL_CAPACITY];\n}\npublic void push(Object e) {\nensureCapacity();\nelements&#91;size++] = e;\n}\npublic Object pop() {\nif (size == 0)\nthrow new EmptyStackException();\nreturn elements&#91;--size];\n}\n\/**\n* Ensure space for at least one more element, roughly\n* doubling the capacity each time the array needs to grow.\n*\/\nprivate void ensureCapacity() {\nif (elements.length == size)\nelements = Arrays.copyOf(elements, 2 * size + 1);\n}\n}<\/code><\/pre>\n\n\n\n<p>O problema dela \u00e9 no m\u00e9todo pop. Quando um objeto \u00e9 retornado e o tamanho diminu\u00eddo, a stack ainda mant\u00e9m uma refer\u00eancia obsoleta a esse objeto. Nessa caso, toda refer\u00eancia que estiver fora da &#8220;por\u00e7\u00e3o ativa&#8221; do array ser\u00e3o obsoletos. A por\u00e7\u00e3o ativa equivale aos elementos que o \u00edndice for menor que o tamanho do array.<\/p>\n\n\n\n<p>Perda de mem\u00f3rias em linguagens como o Java s\u00e3o tamb\u00e9m conhecidas como reten\u00e7\u00e3o n\u00e3o intencionais de objetos, ou &#8220;<em>unintentional object retentions<\/em>&#8220;. Esses objetos ficam exclu\u00eddos do coleta de lixo assim como objetos que ele possa refer\u00eanciar, e assim por diante.<\/p>\n\n\n\n<p>E a solu\u00e7\u00e3o? Tornar nulas as refer\u00eancias assim que um objeto se tornar obsoleto. Segue o treco do c\u00f3digo com a solu\u00e7\u00e3o.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>public Object pop() {\nif (size == 0)\nthrow new EmptyStackException();\nObject result = elements&#91;--size];\nelements&#91;size] = null; \/\/ Eliminate obsolete reference\nreturn result;\n}<\/code><\/pre>\n\n\n\n<p>Mas cuidado. Tornar nula refer\u00eancias a objetos deve ser exce\u00e7\u00e3o e n\u00e3o regra. E a melhor maneira de eliminar refer\u00eancias obsoletas \u00e9 definar cada vari\u00e1vel num menor escopo poss\u00edvel.<\/p>\n\n\n\n<p>Ent\u00e3o quando se deve usar o &#8220;null out&#8221;? Quais aspectos tornam uma classe suscet\u00edvel a &#8220;memory leaks&#8221;? De maneira simples, sempre que houver uma esp\u00e9cie de mem\u00f3ria e que seja gerida por ela. No caso da classe Stack, \u00e9 o array de elementos e seus m\u00e9todos para incluir e remover. O garbage collector n\u00e3o tem como saber se um elemento est\u00e1 inv\u00e1lido, uma vez que guarda a refer\u00eancia aos objetos e n\u00e3o eles em si. Portanto, isso deve ser feito manualmente pelo programador.<\/p>\n\n\n\n<p>At\u00e9 o pr\u00f3ximo item.<\/p>\n\n\n\n<div class=\"twitter-share\"><a href=\"https:\/\/twitter.com\/intent\/tweet?via=sidroniolima\" class=\"twitter-share-button\">Tweet<\/a><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Gerenciamento de mem\u00f3ria em linguagens com Java, que possuem mecanismo de coleta de lixo, ou garbage collection mechanism, podem evitar problemas de perda de mem\u00f3ria, ou &#8220;memory leaks&#8220;. As &#8220;Memory Leaks&#8221; ocorrem quando objetos que j\u00e1 n\u00e3o s\u00e3o utilizados ainda ocupam espa\u00e7o na mem\u00f3ria. Esses objetos est\u00e3o no Heap e suas vari\u00e1veis na Stack, no [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[27,116],"tags":[115,29,117],"class_list":["post-404","post","type-post","status-publish","format-standard","hentry","category-java","category-performance","tag-effective-java","tag-java","tag-performance"],"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/sidroniolima.com.br\/blog\/wp-json\/wp\/v2\/posts\/404","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sidroniolima.com.br\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sidroniolima.com.br\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sidroniolima.com.br\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/sidroniolima.com.br\/blog\/wp-json\/wp\/v2\/comments?post=404"}],"version-history":[{"count":5,"href":"https:\/\/sidroniolima.com.br\/blog\/wp-json\/wp\/v2\/posts\/404\/revisions"}],"predecessor-version":[{"id":409,"href":"https:\/\/sidroniolima.com.br\/blog\/wp-json\/wp\/v2\/posts\/404\/revisions\/409"}],"wp:attachment":[{"href":"https:\/\/sidroniolima.com.br\/blog\/wp-json\/wp\/v2\/media?parent=404"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sidroniolima.com.br\/blog\/wp-json\/wp\/v2\/categories?post=404"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sidroniolima.com.br\/blog\/wp-json\/wp\/v2\/tags?post=404"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}