Estou tentando configurar o Atlassian Fisheye/Crucible como um serviço no Win 2K3 R2 há duas semanas. Continuo recebendo vários erros "java.lang.OutOfMemoryError: PermGen space", que travam o Fisheye e me forçam a reiniciar o serviço.
Eu segui oexemplono site de suporte da Atlassian para configurar MaxPermSize no wrapper de serviço. No entanto, quando verifico o SysInfo nas páginas do Fisheye Admin e no log de depuração, não vejo nenhuma confirmação. As informações do Java Heap estão em ambos os lugares, então espero que a configuração MaxPermSize apareça em ambos os lugares.
O erro persiste e o suporte da Atlassian tem ajudado pouco.
Agradeço qualquer ajuda.
Responder1
Você pode definir isso em seu arquivo Wrapper.conf. Aqui está meu arquivo de configuração e está funcionando muito bem para mim. Estou usando-o com o Fisheye 2.6.3 em execução no Windows Server 2008 R2. Este arquivo é praticamente idêntico à configuração sample/default, com algumas adições importantes que comentarei no final.
#************************************************* ******************* # Propriedades do wrapper #************************************************* ******************* # Diretório de trabalho wrapper.working.dir=../../ # Aplicativo Java wrapper.java.command=C:\Arquivos de programas\Java\jdk1.6.0_25\bin\java.exe # Classe principal Java. Esta classe deve implementar a interface WrapperListener # ou garanta que a classe WrapperManager seja inicializada. Ajudante # aulas são fornecidas para fazer isso para você. Veja a seção Integração # da documentação para detalhes. wrapper.java.mainclass=com.cenqua.fisheye.FisheyeServiceWrapper # Java Classpath (inclui wrapper.jar) Adicione elementos do caminho de classe como # necessário começar em 1 (adicionar lib FIRST para que a configuração do log4j seja carregada primeiro) wrapper.java.classpath.1=./fisheyeboot.jar wrapper.java.classpath.2=wrapper/lib/*.jar # Caminho da biblioteca Java (localização de Wrapper.DLL ou libwrapper.so) wrapper.java.library.path.1=wrapper/lib wrapper.java.library.path.2=lib/native/linux-i386 wrapper.java.library.path.3=lib/native/osx-ppc wrapper.java.library.path.4=lib/native/solaris-sparc wrapper.java.library.path.5=lib/native/win32-x86 # Parâmetros Adicionais Java wrapper.java.additional.1=-servidor wrapper.java.additional.2=-showversão wrapper.java.additional.3=-Djava.awt.headless=true # Parâmetros adicionais do JDK 1.5 para jmx wrapper.java.additional.4=-Dcom.sun.management.jmxremote wrapper.java.additional.5=-Dcom.sun.management.jmxremote.port=4242 wrapper.java.additional.6=-Dcom.sun.management.jmxremote.authenticate=false wrapper.java.additional.7=-Dcom.sun.management.jmxremote.ssl=false wrapper.java.additional.8=-Dcom.sun.management.jmxremote.authenticate=false wrapper.java.additional.9=-Dcom.sun.management.jmxremote.password.file=./wrapper/jmxremote.password wrapper.java.additional.10=-Dwrapper.mbean.name="wrapper:type=Controle de wrapper de serviço Java" wrapper.java.additional.11=-Dfisheye.inst="C:\Atlassian\fecru-2.6.3\bin\.." wrapper.java.additional.12=-XX:MaxPermSize=256m wrapper.java.additional.13=-Xrs wrapper.java.additional.14=-Dfile.encoding=UTF-8 # Tamanho inicial do heap Java (em MB) wrapper.java.initmemory=64 # Tamanho máximo de heap Java (em MB) wrapper.java.maxmemory=1024 # Parâmetros do aplicativo. Adicione parâmetros conforme necessário a partir de 1 # O primeiro parâmetro da aplicação é o nome da classe cujo principal # método deve ser chamado quando o aplicativo for iniciado. A classe # nome é seguido pelo número de parâmetros a serem passados para seu principal # método. Depois vêm os parâmetros reais. wrapper.app.parameter.1=com.cenqua.fisheye.FishEyeCtl wrapper.app.parameter.2=1 wrapper.app.parameter.3=iniciar # Os parâmetros de início são seguidos do nome da classe cujo principal # método deve ser chamado para interromper o aplicativo. O nome da classe de parada # é seguido por um sinalizador que controla se o Wrapper deve ou não # espere que todos os threads não-daemon sejam concluídos antes de sair da JVM. # A flag é seguida pelo número de parâmetros a serem passados para o # interrompe o método principal da classe. Finalmente vêm os parâmetros reais. wrapper.app.parameter.4=com.cenqua.fisheye.FishEyeCtl wrapper.app.parameter.5=true wrapper.app.parameter.6=1 wrapper.app.parameter.7=parar #************************************************* ******************* # Propriedades de registro do wrapper #************************************************* ******************* # Formato de saída para o console. (Veja a documentação para formatos) wrapper.console.format=M # Nível de log para saída do console. (Veja a documentação para níveis de log) wrapper.console.loglevel=INFO # Arquivo de log a ser usado para registro de saída do wrapper. wrapper.logfile=var/log/wrapper.log # Formato de saída do arquivo de log. (Veja a documentação para formatos) wrapper.logfile.format=LPTM # Nível de log para saída do arquivo de log. (Veja a documentação para níveis de log) wrapper.logfile.loglevel=INFO # Tamanho máximo que o arquivo de log poderá crescer antes # o log é rolado. O tamanho é especificado em bytes. O valor padrão # de 0, desativa a rolagem de log. Pode abreviar com o 'k' (kb) ou # Sufixo 'm' (mb). Por exemplo: 10m = 10 megabytes. wrapper.logfile.maxsize=50m # Número máximo de arquivos de log rolados que serão permitidos antes do antigo # arquivos foram excluídos. O valor padrão de 0 não implica nenhum limite. wrapper.logfile.maxfiles=10 # Nível de log para saída de log de sys/evento. (Veja a documentação para níveis de log) wrapper.syslog.loglevel=NONE #************************************************* ******************* # Propriedades do wrapper do Windows #************************************************* ******************* # Título a ser usado ao executar como console wrapper.console.title=Olho de peixe #************************************************* ******************* # Propriedades do serviço Wrapper Windows NT/2000/XP #************************************************* ******************* # AVISO - Não modifique nenhuma dessas propriedades quando um aplicativo # usando este arquivo de configuração foi instalado como um serviço. # Desinstale o serviço antes de modificar esta seção. O # serviço pode então ser reinstalado. #Nome do serviço wrapper.ntservice.name=Olho de peixe #Exibe o nome do serviço wrapper.ntservice.displayname=Olho de peixe #Descrição do serviço wrapper.ntservice.description=Olho de peixe # Dependências de serviço. Adicione dependências conforme necessário a partir de 1 wrapper.ntservice.dependency.1= # Modo em que o serviço está instalado. AUTO_START ou DEMAND_START wrapper.ntservice.starttype=AUTO_START # Permita que o serviço interaja com a área de trabalho. wrapper.ntservice.interactive=falso
Linhas notáveis
wrapper.java.command=C:\Arquivos de programas\Java\jdk1.6.0_25\bin\java.exe
Caminho completo para o executável do servidor 'hotspot' JDK. Observe, baixe o JDK completo, não apenas o JRE.
wrapper.java.additional.11=-Dfisheye.inst="C:\Atlassian\fecru-2.6.3\bin.."
wrapper.java.additional.12=-XX:MaxPermSize=256m
wrapper.java.additional.13 =-Xrs
wrapper.java.additional.14=-Dfile.encoding=UTF-8
Nenhuma das opções acima é mostrada na documentação do Atlassian; adicionei-as ao longo do tempo por tentativa e erro. Quando o FeCru é iniciado pela primeira vez no wrapper de serviço, ele pode parar com um erro de falta de memória, a linha 'MaxPermSize' corrige isso.
Também descobri que é necessário especificar FISHEYE_INST conforme mostrado acima. Não tenho ideia de por que o caminho está especificado /..
no final, foi assim no exemplo que encontrei. Algum ritual Linux culinário, sem dúvida. As outras linhas, não me lembro para que serviam, mas adicionei-as por um motivo ou outro e não documentei o porquê. Ninguém é perfeito ;-)
wrapper.java.initmemory=64 wrapper.java.maxmemory=1024
As alocações de memória heap aumentaram em relação aos padrões - eu indexo alguns repositórios bastante substanciais e posso pagar pelos recursos extras - você pode se safar com as alocações menores padrão.