Como posso verificar os argumentos de inicialização do tamanho de heap para uma JVM ativa que está executando como um serviço do Windows e carregando parâmetros da JVM a partir do registro?

3

Eu tenho um servidor Windows com um aplicativo de terceiros que é executado como um serviço do Windows. O serviço / aplicativo é, na verdade, uma máquina virtual java, no entanto, ele é exibido no gerenciador de tarefas como um exe (vamos chamá-lo de foo.exe ).

Eu sei que o programa é projetado para pegar as preferências de alocação de tamanho de heap da JVM do registro e eu sei onde no registro ele está procurando por essas informações. Dito isto, não tenho certeza se um administrador editou o registro antes (ou depois) de iniciar o serviço.

Como este é um sistema de produção, estou relutante em reiniciar o serviço (especialmente se ele já estiver usando os valores de alocação de heap que estou vendo no registro agora). Existe alguma outra maneira que eu possa dizer sem reiniciar o serviço? Eu suponho que eu poderia olhar para a memória de uso atual no gerenciador de tarefas, mas isso não forneceria os valores exatos.

    
por Mike B 05.12.2014 / 01:07

3 respostas

2

Mostre a coluna da linha de comando no gerenciador de tarefas, que deve ter as configurações assumindo que elas foram passadas na linha de comando:

    
por 05.12.2014 / 01:22
2

Observe que a resposta abaixo pode exigir que o JMX seja ativado - acredito que está desativado por padrão no JRE público e requer uma reinicialização da JVM para alterá-lo, o que seria inútil em sua caso. Ainda assim, vale um tiro?

Se eles funcionam ou não, também dependerá do método específico de agrupamento nativo usado por este aplicativo.

Você deve conseguir copiar essas ferramentas junto com jli.dll de um JDK com uma versão e arquitetura secundárias correspondentes para o JRE que está sendo executado. Você também pode executar as ferramentas remotamente, embora seja menos provável que funcione sem alguma configuração inicial devido aos requisitos de segurança para conexões remotas.

A ferramenta jps , disponível no JDK, deve ser capaz de fornecer essa informação com o comando jps -v . Se você tiver vários processos Java em execução, poderá identificá-los pelo PID na primeira coluna.

Exemplo de saída no Netbeans (PID 9056) (que usa um wrapper nativo semelhante ao seu aplicativo):

9056  -Dnetbeans.importclass=org.netbeans.upgrade.AutoUpgrade -Dnetbeans.accept_
license_class=org.netbeans.license.AcceptLicense -client -Xss2m -Xms32m -XX:Perm
Size=32m -Dapple.laf.useScreenMenuBar=true -Dapple.awt.graphics.UseQuartz=true -
Dsun.java2d.noddraw=true -Dsun.java2d.dpiaware=true -Dsun.zip.disableMemoryMappi
ng=true -Xmx1024m <snip>

Observe os argumentos -Xss , -Xms e -Xmx .

Outra coisa que você pode experimentar é jinfo , que permite que você segmente um PID específico, por exemplo jinfo 9056 .

NOTE - This utility is unsupported and may or may not be available in future versions of the JDK.

Você também pode tentar jconsole e jvisualvm , embora eles pareçam ter problemas para anexar a JVMs agrupadas e listar argumentos de VM, do meu teste.

    
por 05.12.2014 / 06:36
1

Procure no "C: \ Arquivos de Programas (x86) \ Foo Vender" para qualquer arquivo de texto que contenha as strings -Xms e -Xmx - ele pode estar puxando os valores de um arquivo INI . Se não houver, é provável que eles estejam no registro em algum lugar, como você imaginou. Um dos meus clientes usa um proxy da Web que é executado como um serviço do Windows e obtém os parâmetros de inicialização de uma chave de registro instalada.

Se você quiser confirmar exatamente quais arquivos ou chaves do Registro estão sendo lidos durante a inicialização do EXE, use o ProcMon da Sysinternals enquanto inicia o serviço.

    
por 05.12.2014 / 02:32