{"id":2088,"date":"2015-10-22T14:57:23","date_gmt":"2015-10-22T14:57:22","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=2088"},"modified":"2022-12-15T19:21:14","modified_gmt":"2022-12-16T03:21:14","slug":"all-the-small-things-jvm-profiling-lessons-from-the-trenches","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/pt\/all-the-small-things-jvm-profiling-lessons-from-the-trenches\/","title":{"rendered":"Todas as pequenas coisas - Li\u00e7\u00f5es de cria\u00e7\u00e3o de perfil de JVM das trincheiras"},"content":{"rendered":"<p><a href=\"https:\/\/openjdk.java.net\/projects\/code-tools\/jmh\/\">JMH (Java Microbenchmarking Harness)<\/a> tornou-se uma das minhas ferramentas mais valiosas para quantificar (e, em \u00faltima an\u00e1lise, justificar) uma otimiza\u00e7\u00e3o de desempenho dentro do Couchbase Java SDK e seus projetos relacionados. Como vejo muitos usu\u00e1rios e clientes tendo dificuldades com quest\u00f5es semelhantes, achei que seria uma boa ideia mostrar como voc\u00ea pode usar o <a href=\"https:\/\/www.oracle.com\/technetwork\/java\/javaseproducts\/mission-control\/java-mission-control-1998576.html\">JMC (Java Mission Control)<\/a> em combina\u00e7\u00e3o com o JMH para orientar suas decis\u00f5es de teste de otimiza\u00e7\u00e3o de desempenho de perfil e JMC usando dados reais em vez de suposi\u00e7\u00f5es.<\/p>\n<p>Voc\u00ea pode simplesmente ler e examinar o c\u00f3digo-fonte ao lado, mas se quiser reproduzir o que vou mostrar, precisar\u00e1 de um Oracle JDK recente (para o JMH, estou usando o 1.8.0_51). Al\u00e9m disso, n\u00e3o mostrarei todos os detalhes menores, como importar um projeto para seu IDE ou algo semelhante. Se voc\u00ea tiver dificuldades com os conceitos b\u00e1sicos de cria\u00e7\u00e3o de perfil de desempenho do Java, esta publica\u00e7\u00e3o provavelmente n\u00e3o \u00e9 para voc\u00ea imediatamente.<\/p>\n<p>O problema com a maioria dos aplicativos e bibliotecas reais \u00e9 que n\u00e3o h\u00e1 nenhum problema \u00f3bvio. Se voc\u00ea encontrar algo, der um tapinha nas costas e for consert\u00e1-lo, essas chances s\u00e3o raras. Muitas vezes, voc\u00ea precisa fazer v\u00e1rios pequenos aprimoramentos para obter melhores resultados. No Java SDK, n\u00f3s nos preocupamos em aumentar a taxa de transfer\u00eancia e, ao mesmo tempo, minimizar a lat\u00eancia o m\u00e1ximo poss\u00edvel. Como essas duas propriedades n\u00e3o se amam particularmente, h\u00e1 apenas algumas coisas que voc\u00ea pode fazer para que ambas fiquem mais felizes ao mesmo tempo:<\/p>\n<ol>\n<li>Reduzir a quantidade de CPU que seu aplicativo precisa para fazer c\u00e1lculos<\/li>\n<li>Minimizar a conten\u00e7\u00e3o e os pontos de sincroniza\u00e7\u00e3o<\/li>\n<li>Evite aloca\u00e7\u00f5es de objetos para que o GC fa\u00e7a menos<\/li>\n<\/ol>\n<p>Neste exemplo, voc\u00ea ver\u00e1 o n\u00famero 3 (e um) em a\u00e7\u00e3o. Estou executando o seguinte c\u00f3digo no projeto core-io:<\/p>\n<p>Se voc\u00ea j\u00e1 assistiu a algumas de minhas palestras, sempre digo \u00e0s pessoas que algo assim n\u00e3o \u00e9 um benchmark adequado - ent\u00e3o por que fa\u00e7o isso aqui? A grande diferen\u00e7a \u00e9 que, como usu\u00e1rio, voc\u00ea est\u00e1 fazendo um benchmark do Couchbase como um todo, essa n\u00e3o \u00e9 uma carga de trabalho realista que imita o seu sistema de produ\u00e7\u00e3o. Como desenvolvedor de bibliotecas, quero encontrar caminhos de c\u00f3digo quentes e torn\u00e1-los mais r\u00e1pidos, portanto, executar o mesmo c\u00f3digo repetidamente exp\u00f5e melhor esses caminhos no profiler da JVM (Java).<\/p>\n<p>Quando executo esse c\u00f3digo em meu n\u00f3 local do Couchbase Server, obtenho cerca de 9 mil opera\u00e7\u00f5es\/s. N\u00e3o estou interessado em aumentar a taxa de transfer\u00eancia neste momento, estou tentando reduzir as aloca\u00e7\u00f5es de objetos no caminho do c\u00f3digo quente em primeiro lugar. Ao iniciar o JMC e apont\u00e1-lo para a minha JVM por meio do JFR (Java Flight Recorder) e, em seguida, deixar a m\u00e1quina sozinha por 5 minutos enquanto fa\u00e7o o perfil, obtive o seguinte:<\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/original-assets\/all-the-small-things---jvm-profiling-lessons-from-the-trenches\/allocations-before.png\" \/><\/p>\n<p>H\u00e1 400 MB alocados em 5 minutos para objetos KeyValueStatus[]. Isso pode n\u00e3o ser \u00f3bvio para voc\u00ea, mas sei que recentemente alteramos algo nesse caminho de c\u00f3digo (consulte <a href=\"https:\/\/github.com\/couchbase\/couchbase-jvm-core\/commit\/7e63fe3b445ebe131b910f3dff2647c5f5414d02\"> aqui<\/a>) e nunca vi esse tipo espec\u00edfico de aloca\u00e7\u00e3o aparecer antes. Ap\u00f3s uma r\u00e1pida investiga\u00e7\u00e3o, ficou claro que o suspeito est\u00e1 no seguinte caminho de c\u00f3digo (observe como o JFR nos guia para o lugar certo):<\/p>\n<p>Toda vez que chega uma resposta, n\u00f3s a comparamos com o enum KeyValueStatus para definir o status de resposta adequado. Um dos meus colegas fez com que o c\u00f3digo ficasse bonito durante a refatora\u00e7\u00e3o, mas tamb\u00e9m introduziu sutilmente a sobrecarga de GC. Como mostram as informa\u00e7\u00f5es de cria\u00e7\u00e3o de perfil, values() sempre cria uma matriz para que possamos iterar sobre ela e encontrar o c\u00f3digo correspondente. N\u00e3o \u00e9 muito, mas vai se acumulando com o tempo. Mas o mais importante: \u00e9 um lixo desnecess\u00e1rio.<\/p>\n<p>Acontece que algumas respostas s\u00e3o (muito) mais prov\u00e1veis de acontecer do que outras, portanto, podemos otimizar para o caso comum (sempre uma boa ideia). N\u00e3o vou aborrec\u00ea-lo com todos os detalhes de baixo n\u00edvel, mas, no caso do GET, normalmente voc\u00ea obter\u00e1 um SUCCESS se o documento existir ou um NOT_FOUND se o documento n\u00e3o existir. Portanto, uma coisa que podemos fazer \u00e9 o seguinte:<\/p>\n<p>Ao alterar o c\u00f3digo e executar o JFR novamente, as aloca\u00e7\u00f5es de matriz desapareceram:<\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/original-assets\/all-the-small-things---jvm-profiling-lessons-from-the-trenches\/allocations-after.png\" \/><\/p>\n<p>Na maioria das vezes, os desenvolvedores tendem a parar nesse ponto, mas eu recomendo que voc\u00ea continue lendo. O fato de termos evitado as aloca\u00e7\u00f5es de array (o que \u00e9 bom) n\u00e3o significa que seja mais r\u00e1pido, certo? Em geral, acredita-se que sim, mas j\u00e1 fui surpreendido muitas vezes no passado para acreditar nisso. Mesmo que estejamos certos, \u00e9 bom fazer um microbenchmark r\u00e1pido do JMH para descobrir isso. Isso tamb\u00e9m nos permitir\u00e1 quantificar quaisquer melhorias para o N\u00b01 acima, e n\u00e3o apenas para o N\u00b03, que j\u00e1 verificamos.<\/p>\n<p>O JMH faz parte do projeto OpenJDK e n\u00e3o \u00e9 muito dif\u00edcil de usar. Voc\u00ea pode configurar um projeto usando o comando mvn archetype:generate que pode ser encontrado em sua p\u00e1gina inicial. Depois de ter o esqueleto do projeto, voc\u00ea tem duas op\u00e7\u00f5es: adicionar o Java SDK como uma depend\u00eancia (ele ser\u00e1 sombreado automaticamente) ou simplesmente copiar o enum. Dependendo do tamanho de seus testes e do que deseja testar, voc\u00ea deve escolher uma das duas op\u00e7\u00f5es. Como nossos testes atuais s\u00e3o independentes, podemos copiar o ENUM para o projeto. Isso tem a vantagem de podermos modific\u00e1-lo \u00e0 medida que avan\u00e7amos, adicionar novos m\u00e9todos para testar coisas e coisas do g\u00eanero.<\/p>\n<p>Copiei a classe KeyValueStatus da vers\u00e3o 2.2.0 e alterei o c\u00f3digo para que possamos chamar duas variantes ao mesmo tempo:<\/p>\n<p>Agora podemos escrever nosso benchmark JMH (simples):<\/p>\n<p>Em seguida, compilamos o c\u00f3digo e o executamos na linha de comando. Primeiro, execute \"mvn clean install\" e, em seguida, inicie-o com \"java -jar target\/benchmarks.jar -wi 10 -f1 -i 10 -bm avgt -tu ns\".<\/p>\n<p>Se isso for muito complicado para voc\u00ea, significa apenas que queremos medir a lat\u00eancia m\u00e9dia em nanossegundos e realizar 10 itera\u00e7\u00f5es de aquecimento, bem como 10 itera\u00e7\u00f5es medidas em uma bifurca\u00e7\u00e3o. Curioso? Aqui est\u00e3o os resultados:<\/p>\n<p>Todas as opera\u00e7\u00f5es est\u00e3o no intervalo inferior de nanossegundos, portanto, a JVM faz um bom trabalho de otimiza\u00e7\u00e3o do loop, mas n\u00e3o consegue superar as opera\u00e7\u00f5es simples de compara\u00e7\u00e3o e retorno. Como o c\u00f3digo otimizado tem um fallback, voc\u00ea pode ver no c\u00f3digo 134 que ele retorna ao loop. O que voc\u00ea pode ver al\u00e9m disso nas execu\u00e7\u00f5es \"originais\" \u00e9 que tamb\u00e9m importa onde os elementos s\u00e3o colocados no ENUM depois que voc\u00ea faz o loop sobre ele. 0 e 1 est\u00e3o praticamente na parte superior, enquanto 134 est\u00e1 na parte inferior. Portanto, at\u00e9 mesmo a reordena\u00e7\u00e3o para o caso comum faz sentido.<\/p>\n<p>Portanto, a esta altura, estamos bastante convencidos de que faz sentido implementar essa altera\u00e7\u00e3o. Ela reduz as aloca\u00e7\u00f5es e \u00e9 mais r\u00e1pida de executar. Al\u00e9m disso, ela n\u00e3o torna o c\u00f3digo muito mais complexo. Na pr\u00e1tica, por\u00e9m, precisamos de mais c\u00f3digos no caminho otimizado, j\u00e1 que esses dois n\u00e3o s\u00e3o suficientes. Da longa lista enum, eles s\u00e3o:<\/p>\n<ul>\n<li>SUCESSO<\/li>\n<li>ERR_NOT_FOUND<\/li>\n<li>ERR_EXISTS<\/li>\n<li>ERR_NOT_MY_VBUCKET<\/li>\n<li>ERR_BUSY<\/li>\n<li>ERR_TOO_BIG<\/li>\n<li>ERR_TEMP_FAIL<\/li>\n<\/ul>\n<p>Portanto, resta uma \u00faltima pergunta a ser respondida: devemos usar if\/elseif para eles ou um simples bloco switch()? Isso tem alguma import\u00e2ncia? Mais um benchmark JMH:<\/p>\n<p>E aqui est\u00e3o os resultados:<\/p>\n<p>Agora, inclu\u00edmos todos os tr\u00eas par\u00e2metros em nosso c\u00f3digo de caminho r\u00e1pido, de modo que n\u00e3o h\u00e1 mais nenhum outlier. Al\u00e9m disso, voc\u00ea pode ver que n\u00e3o h\u00e1 nenhuma diferen\u00e7a pr\u00e1tica para o nosso caso de uso. Portanto, tanto o caso quanto o if\/else funcionam bem e podem ser escolhidos com base na prefer\u00eancia e na clareza do c\u00f3digo.<\/p>\n<p>\u00c9 isso por hoje! Reduzir as aloca\u00e7\u00f5es de objetos e tornar o c\u00f3digo mais r\u00e1pido \u00e9 um efeito colateral do uso de ferramentas como JMH e JFR para medi\u00e7\u00f5es informadas, em vez de suposi\u00e7\u00f5es. Feliz hacking e sem condi\u00e7\u00f5es de corrida para todos voc\u00eas.<\/p>","protected":false},"excerpt":{"rendered":"<p>JMH (Java Microbenchmarking Harness) has become one of my invaluable tools to quantify (and ultimately justify) a performance optimization inside the Couchbase Java SDK and its related projects. Since I see many users and customers struggling with similar questions, I [&hellip;]<\/p>","protected":false},"author":19,"featured_media":13873,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1],"tags":[],"ppma_author":[8987],"class_list":["post-2088","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.8 (Yoast SEO v25.8) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>JVM Profiling | JMH (Java) Performance + Benchmark Testing<\/title>\n<meta name=\"description\" content=\"Reduce object allocations and making code faster as a side effect by using tools like JMH and JFR for educated measurements instead of wild guessing.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.couchbase.com\/blog\/pt\/all-the-small-things-jvm-profiling-lessons-from-the-trenches\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"All The Small Things - JVM Profiling Lessons From The Trenches\" \/>\n<meta property=\"og:description\" content=\"Reduce object allocations and making code faster as a side effect by using tools like JMH and JFR for educated measurements instead of wild guessing.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/pt\/all-the-small-things-jvm-profiling-lessons-from-the-trenches\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2015-10-22T14:57:22+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2022-12-16T03:21:14+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2022\/11\/couchbase-nosql-dbaas.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1800\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Michael Nitschinger\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@daschl\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Michael Nitschinger\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/all-the-small-things-jvm-profiling-lessons-from-the-trenches\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/all-the-small-things-jvm-profiling-lessons-from-the-trenches\/\"},\"author\":{\"name\":\"Michael Nitschinger\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/e5d4d332756da6f361dd88c1576de61d\"},\"headline\":\"All The Small Things &#8211; JVM Profiling Lessons From The Trenches\",\"datePublished\":\"2015-10-22T14:57:22+00:00\",\"dateModified\":\"2022-12-16T03:21:14+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/all-the-small-things-jvm-profiling-lessons-from-the-trenches\/\"},\"wordCount\":1307,\"commentCount\":3,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/all-the-small-things-jvm-profiling-lessons-from-the-trenches\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"articleSection\":[\"Uncategorized\"],\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/all-the-small-things-jvm-profiling-lessons-from-the-trenches\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/all-the-small-things-jvm-profiling-lessons-from-the-trenches\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/all-the-small-things-jvm-profiling-lessons-from-the-trenches\/\",\"name\":\"JVM Profiling | JMH (Java) Performance + Benchmark Testing\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/all-the-small-things-jvm-profiling-lessons-from-the-trenches\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/all-the-small-things-jvm-profiling-lessons-from-the-trenches\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2015-10-22T14:57:22+00:00\",\"dateModified\":\"2022-12-16T03:21:14+00:00\",\"description\":\"Reduce object allocations and making code faster as a side effect by using tools like JMH and JFR for educated measurements instead of wild guessing.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/all-the-small-things-jvm-profiling-lessons-from-the-trenches\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/all-the-small-things-jvm-profiling-lessons-from-the-trenches\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/all-the-small-things-jvm-profiling-lessons-from-the-trenches\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"width\":1800,\"height\":630},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/all-the-small-things-jvm-profiling-lessons-from-the-trenches\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"All The Small Things &#8211; JVM Profiling Lessons From The Trenches\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"name\":\"The Couchbase Blog\",\"description\":\"Couchbase, the NoSQL Database\",\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"width\":218,\"height\":34,\"caption\":\"The Couchbase Blog\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/e5d4d332756da6f361dd88c1576de61d\",\"name\":\"Michael Nitschinger\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/95e178617974d46e3b02dd1754a3f60b\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/dad99b5e02a74ca4bec14352e9da710160647a97290814b669babb3aac0ea675?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/dad99b5e02a74ca4bec14352e9da710160647a97290814b669babb3aac0ea675?s=96&d=mm&r=g\",\"caption\":\"Michael Nitschinger\"},\"description\":\"Michael Nitschinger works as a Principal Software Engineer at Couchbase. He is the architect and maintainer of the Couchbase Java SDK, one of the first completely reactive database drivers on the JVM. He also authored and maintains the Couchbase Spark Connector. Michael is active in the open source community, a contributor to various other projects like RxJava and Netty.\",\"sameAs\":[\"https:\/\/nitschinger.at\",\"https:\/\/x.com\/daschl\"],\"url\":\"https:\/\/www.couchbase.com\/blog\/pt\/author\/michael-nitschinger\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"JVM Profiling | JMH (Java) Performance + Benchmark Testing","description":"Reduce object allocations and making code faster as a side effect by using tools like JMH and JFR for educated measurements instead of wild guessing.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.couchbase.com\/blog\/pt\/all-the-small-things-jvm-profiling-lessons-from-the-trenches\/","og_locale":"pt_BR","og_type":"article","og_title":"All The Small Things - JVM Profiling Lessons From The Trenches","og_description":"Reduce object allocations and making code faster as a side effect by using tools like JMH and JFR for educated measurements instead of wild guessing.","og_url":"https:\/\/www.couchbase.com\/blog\/pt\/all-the-small-things-jvm-profiling-lessons-from-the-trenches\/","og_site_name":"The Couchbase Blog","article_published_time":"2015-10-22T14:57:22+00:00","article_modified_time":"2022-12-16T03:21:14+00:00","og_image":[{"width":1800,"height":630,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2022\/11\/couchbase-nosql-dbaas.png","type":"image\/png"}],"author":"Michael Nitschinger","twitter_card":"summary_large_image","twitter_creator":"@daschl","twitter_misc":{"Written by":"Michael Nitschinger","Est. reading time":"6 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/all-the-small-things-jvm-profiling-lessons-from-the-trenches\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/all-the-small-things-jvm-profiling-lessons-from-the-trenches\/"},"author":{"name":"Michael Nitschinger","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/e5d4d332756da6f361dd88c1576de61d"},"headline":"All The Small Things &#8211; JVM Profiling Lessons From The Trenches","datePublished":"2015-10-22T14:57:22+00:00","dateModified":"2022-12-16T03:21:14+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/all-the-small-things-jvm-profiling-lessons-from-the-trenches\/"},"wordCount":1307,"commentCount":3,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/all-the-small-things-jvm-profiling-lessons-from-the-trenches\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","articleSection":["Uncategorized"],"inLanguage":"pt-BR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/all-the-small-things-jvm-profiling-lessons-from-the-trenches\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/all-the-small-things-jvm-profiling-lessons-from-the-trenches\/","url":"https:\/\/www.couchbase.com\/blog\/all-the-small-things-jvm-profiling-lessons-from-the-trenches\/","name":"JVM Profiling | JMH (Java) Performance + Benchmark Testing","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/all-the-small-things-jvm-profiling-lessons-from-the-trenches\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/all-the-small-things-jvm-profiling-lessons-from-the-trenches\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2015-10-22T14:57:22+00:00","dateModified":"2022-12-16T03:21:14+00:00","description":"Reduce object allocations and making code faster as a side effect by using tools like JMH and JFR for educated measurements instead of wild guessing.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/all-the-small-things-jvm-profiling-lessons-from-the-trenches\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/all-the-small-things-jvm-profiling-lessons-from-the-trenches\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/all-the-small-things-jvm-profiling-lessons-from-the-trenches\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","width":1800,"height":630},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/all-the-small-things-jvm-profiling-lessons-from-the-trenches\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"All The Small Things &#8211; JVM Profiling Lessons From The Trenches"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"Blog do Couchbase","description":"Couchbase, o banco de dados NoSQL","publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-BR"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"Blog do Couchbase","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","width":218,"height":34,"caption":"The Couchbase Blog"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/e5d4d332756da6f361dd88c1576de61d","name":"Michael Nitschinger","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/95e178617974d46e3b02dd1754a3f60b","url":"https:\/\/secure.gravatar.com\/avatar\/dad99b5e02a74ca4bec14352e9da710160647a97290814b669babb3aac0ea675?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/dad99b5e02a74ca4bec14352e9da710160647a97290814b669babb3aac0ea675?s=96&d=mm&r=g","caption":"Michael Nitschinger"},"description":"Michael Nitschinger trabalha como engenheiro de software principal na Couchbase. Ele \u00e9 o arquiteto e mantenedor do Couchbase Java SDK, um dos primeiros drivers de banco de dados totalmente reativos na JVM. Ele tamb\u00e9m \u00e9 o autor e mantenedor do Couchbase Spark Connector. Michael participa ativamente da comunidade de c\u00f3digo aberto e contribui para v\u00e1rios outros projetos, como RxJava e Netty.","sameAs":["https:\/\/nitschinger.at","https:\/\/x.com\/daschl"],"url":"https:\/\/www.couchbase.com\/blog\/pt\/author\/michael-nitschinger\/"}]}},"authors":[{"term_id":8987,"user_id":19,"is_guest":0,"slug":"michael-nitschinger","display_name":"Michael Nitschinger","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/dad99b5e02a74ca4bec14352e9da710160647a97290814b669babb3aac0ea675?s=96&d=mm&r=g","author_category":"","last_name":"Nitschinger, Principal Software Engineer, Couchbase","first_name":"Michael","job_title":"","user_url":"https:\/\/nitschinger.at","description":"Michael Nitschinger trabalha como engenheiro de software principal na Couchbase. Ele \u00e9 o arquiteto e mantenedor do Couchbase Java SDK, um dos primeiros drivers de banco de dados totalmente reativos na JVM. Ele tamb\u00e9m \u00e9 o autor e mantenedor do Couchbase Spark Connector. Michael participa ativamente da comunidade de c\u00f3digo aberto e contribui para v\u00e1rios outros projetos, como RxJava e Netty."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/2088","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/users\/19"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/comments?post=2088"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/2088\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media\/13873"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media?parent=2088"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=2088"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=2088"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/ppma_author?post=2088"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}