Acabei de achar um Memory Leak que foi causado por um problema de Design de Código. 😳

É uma coisa muito boba, mas que precisaria de uma atenção redobrada. 👇
Como falei para um diretor hoje, não existe culpa nisso porque é uma confusão mesmo.

Todo desenvolvedor #Java sabe que classes AutoCloseable/Closeable precisam ser fechadas, ou precisam estar dentro de um try-with-resource. Certo?

CERTO!
Mas o mesmo mecanismo que nos faz lembrar disso, nos faz lembrar o comportamento padrão de outras classes do Java.

Ora, se é assim, devemos ter muito cuidado ao usar nomes comuns.

E qual nome é o que estou me referindo?
Iterator! No caso o KeyValueIterator do #ApacheKafka!!!

Temos ele por todo o código, mas em alguns casos os devs só usaram método default do Iterator, MAS ELE TAMBÉM é um AutoCloseable!

kafka.apache.org/34/javadoc/org…
E para piorar, temos vários StateStores que são criados em memórias e não precisam chamar esse maldito método.

Até que alguém mudou a configuração para usar RocksDB. 🧨
Lição aprendida, se o método retorna um Iterator e é KeyValueIterator, nunca use os métodos default forEachRemaining.

Por exemplo:

store.all().forEachRemaining(this::doSomething);

O IDE não vai te avisar que tem que fechar o objeto retornado em all().
O agravante é que a memória é alocada fora da Heap. RocksDB é código C chamado por JNI.

Deu canseira achar esse vazamento. Um cara passou 3 semanas investigando e não chegou a conclusão nenhuma porque ele estava olhando a Heap.
Depois desse memory leak o Sonarqube agora terá atenção máxima de todos os times.

Isso é bom, é o que eu vinha lutando há bastante tempo.

• • •

Missing some Tweet in this thread? You can try to force a refresh
 

Keep Current with Victor Osório (https://mastodon.social/@vepo)

Victor Osório (https://mastodon.social/@vepo) Profile picture

Stay in touch and get notified when new unrolls are available from this author!

Read all threads

This Thread may be Removed Anytime!

PDF

Twitter may remove this content at anytime! Save it as PDF for later use!

Try unrolling a thread yourself!

how to unroll video
  1. Follow @ThreadReaderApp to mention us!

  2. From a Twitter thread mention us with a keyword "unroll"
@threadreaderapp unroll

Practice here first or read more on our help page!

More from @vepo

May 12
Ontem meu fio sobre "dev mediocre" viralizou.

Recebi muitas mensagens por DM e várias respostas. Muito obrigado a todos. Eu não imaginei que ia repercutir tanto.

Vi que muitos estão hoje na situação que eu estava em 2012-17.

O que tenho a dizer?
Não desanimem, continuem se preparando. Aquele relato é o resumo de uns 15 anos da minha vida. Nos últimos 4 anos eu tenho colhido o fruto do tempo investido.

Recebi também muitas criticas. Muitos dizendo que eu tava de mimimi, outro disse que era a receita do burnout.
Eu já tive um burnout pra chamar de meu, foi em novembro de 2016. Desde então sei o momento de desligar. Isso é muito importante! Saiba o momento de desligar.

O meu é fim de semana. Sexta é dia de ver um filme e tomar um vinho.
Read 4 tweets
May 12
Eu dei uma palestra igual a essa no #FLISOL! @marcelojscosta Image
@marcelojscosta A diferença é que eu tinha um curso de 3hs para preparar e não tive tempo de preparo suficiente e quando foi apresentar estava moído. 😅
@marcelojscosta @maxdearruda, eu vou mandar no Call4Papers do @soujava. Só preciso terminar meu semestre e tirar uns dias de "descanso". 😉
Read 4 tweets
May 12
Como padrões podem nos ajudar?

Eu sou totalmente a favor de Padrões, creio que quanto mais padrões temos nomeados melhor é a forma de comunicar o Design de Código/Sistemas. Image
E já existe uma série de Padrões para Microservices APIs.

api-patterns.org/patterns/bysco… Image
É engraçado ver que existem Padrões de API que podem ser substituídos por um Event Broker.
Read 4 tweets
May 11
Sobre "dev mediocre"....

É meu sonho um dia terminar o meu dia, abrir uma cerveja e ir jogar videogame.

Creio que não faço isso desde 2015, se duvidar antes.

Quer saber porque? 👇
Nos meus 3 primeiros empregos eu tomei a postura que todo mundo toma. Vou fazer as 8hs diária valer a pena, vou fazer o meu máximo e depois vou descansar em casa.

Resultado? Não deu certo. Minha carreira estava indo por água abaixo.
Em 2015 a empresa que eu estava quebra e eu entro em "crise de meia idade". Minha carreira não tinha andado da forma como eu desejava. Fiquei o ano me reavaliando, eu tinha aceitado um salário R$ 200 abaixo do que recebia na empresa que faliu.
Read 22 tweets
May 11
O que eu falei aqui de design de código e iterator.

Eu fiquei pensando porque .all() é uma opção ruim e qual seria uma boa opção? 👇
O que acontece é que .all() retorna um objeto que será usado dentro de um contexto especifico. Ele não será um objeto de vida longa, não é um Pojo e deve ser fechado.

E qual uma solução boa?
Eu pensei em algumas. Porque não usar um padrão funcional? Dá pra implementar isso em Java 4, só não usar Lambdas.

store.all((key, value) -> doSomething(key, value)
Read 5 tweets
Feb 21
Quando eu morava em republica, conversei com alguém que trabalhava no censo, isso antes de 2010.

Era alguém que tinha feito estatística na Unicamp, essa pessoa me explicou como o censo categorizava as pessoas em Classe A, B e C. (...)
Eles faziam perguntas simples como o número de pessoas que morava na residência, o número de TVs e o número de banheiro.

No nosso caso eram 17 pessoas, uns 5 banheiros e umas 3 TVs.

Resultado? Todos os 17 eram considerados classe A.
A verdade? Todos eram classe C.
Porque isso?

Porque éramos erros estatísticos! Quantos jovens de classe C existem morando em uma casa que cabe 17 pessoas? Provavelmente muitos, mas é um número insignificante para se definir políticas publicas.
Read 12 tweets

Did Thread Reader help you today?

Support us! We are indie developers!


This site is made by just two indie developers on a laptop doing marketing, support and development! Read more about the story.

Become a Premium Member ($3/month or $30/year) and get exclusive features!

Become Premium

Don't want to be a Premium member but still want to support us?

Make a small donation by buying us coffee ($5) or help with server cost ($10)

Donate via Paypal

Or Donate anonymously using crypto!

Ethereum

0xfe58350B80634f60Fa6Dc149a72b4DFbc17D341E copy

Bitcoin

3ATGMxNzCUFzxpMCHL5sWSt4DVtS8UqXpi copy

Thank you for your support!

Follow Us on Twitter!

:(