Quem sou eu

segunda-feira, 30 de novembro de 2009

Dica: Como substituir uma String em vários arquivos ao mesmo tempo

Hoje precisei substituir uma String em 51 arquivos VXML. Como fazer isso? Editar um por um? Não... isso é coisa pra quem usa Windows! :)
Para quem tem um Linux basta usar o comando replace ou então o sed.

Exemplo usando sed:

for i in * ; do sed -i 's/ORIGINAL/NOVO/g' $i; done

Exemplo usando o replace:

replace ORIGINAL NOVO < oldfile > newfile

Usei o sed para fazer o trabalho por que achei mais fácil. Mas tá aí a dica pra quem precisar.

quinta-feira, 26 de novembro de 2009

java.lang.OutOfMemoryError: Dica para quem tem esse tipo de problema com Java

O Java é uma linguagem de programação muito poderosa, mas desde que me entendo por gente, tem problema de gerenciamento de memória.

Recentemente, realizamos a implantação de uma URA (Unidade de Resposta Audível) que tem um backend para integração com o CTI e com a base de dados do cliente. Toda a integração foi desenvolvida em Java e rodava inicialmente em Tomcat, mas foi migrada para o Jetty com o objetivo de evitar problemas de gerenciamento de memória.

Eis que um belo dia, surge a surpresa. O Jetty simplesmente fechava, depois de um período de produção, com carga. O processo desaparecia e não tinha nada no log mostrando o que houve.

Começamos a monitorar o sistema e recebi a seguinte mensagem no prompt quando o problema aconteceu novamente:

# An unexpected error has been detected by Java Runtime Environment:
#
# java.lang.OutOfMemoryError: requested 264496 bytes for Chunk::new. Out of swap space?
#
# Internal Error (414C4C4F434154494F4E0E43505000C7), pid=7896, tid=1878612880
#
# Java VM: Java HotSpot(TM) Server VM (1.6.0-b105 mixed mode)
# An error report file with more information is saved as hs_err_pid7896.log
[thread 1406139280 also had an error]
#
# If you would like to submit a bug report, please visit:
# http://java.sun.com/webapps/bugreport/crash.jsp
#

Pesquisei na Internet e encontrei informações referentes a um possível bug na Java VM. Putz, como eu estava com sorte. Tudo bem. Atualizei para a última JVM, colocamos na produção novamente e o problema apareceu novamente.

Vi em vários sites na Internet orientando para aumentar o heap através do parâmetro -Xmx. Testei, mas não funcionou.

Foi então que descobri que o problema estava relacionado a uma limitação da JVM 32bits de usar no máximo 2GB no heap size. Ou seja, o Jetty começava a alocar os recursos e quando chegava nos 2GB de alocação, gerava esse problema de OutOfMemoryError.

java.lang.OutOfMemoryError: requested 32756 bytes for ChunkPool::allocate. Out of swap space?

Essentially the native objects does not have enough memory to use. This is usually because you have allocated too much memory to your heap reducing the amount available for native objects. See this article.

The solution is to reduce the amount of heap memory you have allocated. For example if you have set -Xmx4096, you should consider reducing this to -Xmx2048m.

Remember if you are using a 32bit JVM you cannot allocate more than -Xmx2048m for linux (and even less for windows). Using a 64 bit JVM can resolve this problem, but is not recommended for fisheye/crucible instances (refer to System Requirements).


Solução: Limitar o seu max heap size em 2048.

Para quem precisa fazer tunning em servidores de aplicação Java seguem alguns links úteis:

terça-feira, 24 de novembro de 2009

Como mudar a memória de um Macbook Pro Unibody

Vou re-ativar o meu blog e tentar mantê-lo atualizado. Nos últimos anos tenho tentado fazer isso, mas infelizmente, devido ao tempo não tenho conseguido.
Vou iniciar os meus posts falando sobre como trocar a memória no Macbook Pro 15' Unibody.
Ontem tomei coragem e finalmente comprei 4GB de memória RAM DDR3 para o meu Macbook Pro 15' Unibody. Estava realmente precisando.A troca da memória no Macbook Pro é um processo bem simples que não precisa de muito trabalho para ser realizado.
Antes da troca: 2GB de RAM
Parte de cima do Meu Macbook Pro 15' Unibody
Parte de trás do Macbook Pro

É necessário uma chave philips pequena para retirar os parafusos da tampa traseira do Macbook. Utilizei o kit de chaves abaixo para realizar a abertura da tampa.
Vamos iniciar a troca. Primeiro, remova a tampa da bateria que não é presa por parafusos, apenas por uma trava e em seguida remova a bateria.
Abra a tampa traseira do Macbook usando a chave Philips e retire os 8 parafusos. Remova a bateria antes de realizar a troca da memória.
Depois de remover a tampa o seu Macbook ficará assim:
Agora que está aberto, basta remover as duas memórias antigas do Macbook e adicionar as duas memórias novas. Feche o Macbook e ligue para testar.
O resultado, seu Macbook agora terá 4Gb de RAM e ficará uma bala! :)