Limitando o uso da memória e da CPU do aplicativo Java

Diga, "execute myApp.jar com cpu = 800 e memória = 1024"

Faço programação em java há muitos anos e é um constrangimento fazer essa pergunta. Eu nem sei se isso é possível ou não. E se sim, como?

O que eu só quero saber é se é possível definir o uso máximo da memória e da CPU de um programa java. De repente, pensei nisso porque recentemente comecei a desenvolver aplicativos móveis. Quero saber como o aplicativo se comportará no dispositivo com memória e processador muito limitados.

Vi mecanismos de física com aplicativos de demonstração que são executados no navegador ou posso executar no meu PC. E se eu os executar em um dispositivo móvel? O desempenho será o mesmo? Em vez de desenvolver um aplicativo móvel de amostra para testar o desempenho da biblioteca, prefiro executá-lo com uma CPU e memória específicas usando o meu PC primeiro.

A propósito, tentei pesquisar no Google ... tudo o que encontrei foi o monitoramento e o ajuste de desempenho. Eu posso estar usando palavras-chave erradas.

Resposta 1

A JVM não tem controle sobre o uso da CPU nem prioridade.

A JVM tem controle sobre o uso máximo / min de memória.

Existe uma solução alternativa. É possível executar cada JVM em um [contêiner do Docker] [1]. E controle a alocação de recursos (memória, CPU, rede, E / S) para cada contêiner. Esse é exatamente o valor agregado dos contêineres do Docker.

[1]: A JVM não tem controle sobre o uso da CPU nem prioridade. No entanto, você pode executar cada JVM em um contêiner Docker separado. E controle a alocação de recursos para cada contêiner. Esse é exatamente o valor agregado dos contêineres do Docker.

Resposta: 2

Nesse cenário, pode ajudar a executar o aplicativo em um emulador móvel (por exemplo, Android).

Com isso, você pode emular um dispositivo móvel com CPU / memória específica. Portanto, você deve obter desempenho comparável a um dispositivo com CPU mais lenta e menos RAM.

O emulador Android / Nokia é gratuito e está disponível para download nas seções de desenvolvedores dos sites Nokia / Google.

Resposta: 3

https://github.com/haosdent/jcgroup jcgroup é sua melhor escolha. Você pode usar esta biblioteca para limitar os compartilhamentos de CPU, velocidade de E / S de disco, largura de banda de rede e etc.

Resposta: 4

Por favor, tenha cuidado com as opções de memória e CPU ao executar o jvm 8 ou anterior. Existem alguns artigos muito bons sobre isso. Confira:

https://developers.redhat.com/blog/2017/03/14/java-inside-docker/

https://jaxenter.com/nobody-puts-java-container-139373.html

Dito isso, a conteinerização - é o caminho certo para a arquitetura de microsserviços, independentemente da pilha, e a jvm não é uma exceção a isso. No entanto, é importante estar ciente das advertências.

Resposta: 5

O Docker oferece opções de gerenciamento de recursos para limitar o acesso da CPU à execução de contêineres do Docker. Ter um olhar para os CFS agendador opções disponíveis com docker runde Limite de recursos de um recipiente na documentação Docker, tais como:

  • --cpus=<value>- Especifique quanto dos recursos de CPU disponíveis um contêiner pode usar. Por exemplo, se a máquina host tiver duas CPUs e você definir --cpus="1.5", o contêiner será garantido no máximo uma e meia das CPUs. Isso é equivalente a definir --cpu-period="100000"e --cpu-quota="150000". Disponível no Docker 1.13 e superior.
  • --cpuset-cpus- Limite as CPUs ou núcleos específicos que um contêiner pode usar. Uma lista separada por vírgula ou um intervalo de CPUs separadas por hífen que um contêiner pode usar, se você tiver mais de uma CPU. A primeira CPU é numerada 0. Um valor válido pode ser 0-3(para usar a primeira, a segunda, a terceira e a quarta CPU) ou 1,3(para usar a segunda e a quarta CPU).

Essas opções também estão disponíveis via docker-compose, ao implantar um enxame / pilha do Docker, conforme mencionado na referência de versão 3 do arquivo Compose em resources:

version: '3'
services:
  redis:
    image: redis:alpine
    deploy:
      resources:
        limits:
          cpus: '0.50'
          memory: 50M
        reservations:
          cpus: '0.25'
          memory: 20M```

Nota: que as opções de recursos herdados na janela de encaixe compõem a v2 agora estão limitadas às pilhas na migração para a v3 .

Resposta: 6

Estou usando logs de chamadas do Android no meu aplicativo e gostaria de determinar se a última chamada foi de entrada ou de saída. Isto é o que eu tentei até agora, no entanto, o tipo int me dá um erro ...

Eu escolhi pegar o arquivo de propriedades para personalizar algumas configurações. Eu uso o código a seguir para disponibilizar um Objeto de Propriedades em uma classe Propriedades defaultProps = new Properties (); experimentar { ...

Eu tenho um programa Java que analisa vários arquivos de entrada diferentes. Mesmo quando um erro é encontrado nesses arquivos de entrada, a análise ainda pode continuar e coletar vários outros erros também. Então, o que eu quero ...

Estou tentando executar um PURGE com HttpUrlConnection como este: private void callVarnish (URL da URL) {HttpURLConnection conn = null; tente {conn = (HttpURLConnection) url.openConnection (...