Como faço para diagnosticar uma possível regressão no pacote Java?

0

Ontem, depois de instalar as atualizações diárias de software, experimentei alto uso da CPU em um aplicativo Java que funcionava bem até então. Java estava entre os pacotes atualizados. De /var/log/apt/history.log :

Start-Date: 2015-10-29  07:18:28
Commandline: aptdaemon role='role-commit-packages' sender=':1.108'
Install: libsctp1:amd64 (1.0.16+dfsg-2), lksctp-tools:amd64 (1.0.16+dfsg-2, automatic)
Upgrade: python3-problem-report:amd64 (2.17.2-0ubuntu1.5, 2.17.2-0ubuntu1.7), qtcreator-plugin-ubuntu-common:amd64 (3.1.1+15.10.20150720-0ubuntu1~0vivid1, 3.1.1+15.10.20151018-0ubuntu1~0vivid1), python-apport:amd64 (2.17.2-0ubuntu1.5, 2.17.2-0ubuntu1.7), ubuntu-sdk-qmake-extras:amd64 (3.1.1+15.10.20150720-0ubuntu1~0vivid1, 3.1.1+15.10.20151018-0ubuntu1~0vivid1), libapache2-mod-php5:amd64 (5.6.4+dfsg-4ubuntu6.3, 5.6.4+dfsg-4ubuntu6.4), php5-mysql:amd64 (5.6.4+dfsg-4ubuntu6.3, 5.6.4+dfsg-4ubuntu6.4), php5-common:amd64 (5.6.4+dfsg-4ubuntu6.3, 5.6.4+dfsg-4ubuntu6.4), php5-curl:amd64 (5.6.4+dfsg-4ubuntu6.3, 5.6.4+dfsg-4ubuntu6.4), php5-dev:amd64 (5.6.4+dfsg-4ubuntu6.3, 5.6.4+dfsg-4ubuntu6.4), python-problem-report:amd64 (2.17.2-0ubuntu1.5, 2.17.2-0ubuntu1.7), qtcreator-plugin-ubuntu:amd64 (3.1.1+15.10.20150720-0ubuntu1~0vivid1, 3.1.1+15.10.20151018-0ubuntu1~0vivid1), php5-readline:amd64 (5.6.4+dfsg-4ubuntu6.3, 5.6.4+dfsg-4ubuntu6.4), php5:amd64 (5.6.4+dfsg-4ubuntu6.3, 5.6.4+dfsg-4ubuntu6.4), openjdk-7-jdk:amd64 (7u79-2.5.6-0ubuntu1.15.04.1, 7u85-2.6.1-5ubuntu0.15.04.1), shotwell-common:amd64 (0.20.2-0ubuntu3, 0.20.2-0ubuntu4), shotwell:amd64 (0.20.2-0ubuntu3, 0.20.2-0ubuntu4), openjdk-7-jre-headless:amd64 (7u79-2.5.6-0ubuntu1.15.04.1, 7u85-2.6.1-5ubuntu0.15.04.1), ntp:amd64 (4.2.6.p5+dfsg-3ubuntu6, 4.2.6.p5+dfsg-3ubuntu6.2), apport-kde:amd64 (2.17.2-0ubuntu1.5, 2.17.2-0ubuntu1.7), php5-cli:amd64 (5.6.4+dfsg-4ubuntu6.3, 5.6.4+dfsg-4ubuntu6.4), openjdk-7-jre:amd64 (7u79-2.5.6-0ubuntu1.15.04.1, 7u85-2.6.1-5ubuntu0.15.04.1), openjdk-7-source:amd64 (7u79-2.5.6-0ubuntu1.15.04.1, 7u85-2.6.1-5ubuntu0.15.04.1), apport-gtk:amd64 (2.17.2-0ubuntu1.5, 2.17.2-0ubuntu1.7), apport:amd64 (2.17.2-0ubuntu1.5, 2.17.2-0ubuntu1.7), php-pear:amd64 (5.6.4+dfsg-4ubuntu6.3, 5.6.4+dfsg-4ubuntu6.4), libaudiofile1:amd64 (0.3.6-2, 0.3.6-2ubuntu0.15.04.1), icedtea-7-jre-jamvm:amd64 (7u79-2.5.6-0ubuntu1.15.04.1, 7u85-2.6.1-5ubuntu0.15.04.1), openjdk-7-doc:amd64 (7u79-2.5.6-0ubuntu1.15.04.1, 7u85-2.6.1-5ubuntu0.15.04.1), python3-apport:amd64 (2.17.2-0ubuntu1.5, 2.17.2-0ubuntu1.7), php5-gd:amd64 (5.6.4+dfsg-4ubuntu6.3, 5.6.4+dfsg-4ubuntu6.4), ntpdate:amd64 (4.2.6.p5+dfsg-3ubuntu6, 4.2.6.p5+dfsg-3ubuntu6.2)
End-Date: 2015-10-29  07:19:15

Enquanto o aplicativo está em execução, tanto java quanto Xorg usam mais de 50% da CPU. Isso está causando lentidão geral no aplicativo e tenho certeza de que não era o caso no passado.

A aplicação é na verdade um jogo (baseado em swing). Embora seja de código aberto, suponho que não seja adequado para um instrumento , por isso não posso usá-lo para enviar um relatório de bug. Além disso, eu não sei onde eu poderia denunciar.

Minha pergunta é: como posso descobrir o que está errado, para que eu possa relatar um bug em algum lugar (onde?) e ajudar a corrigir o problema?

Eu fiz um dump de thread , mas eu não sei o que fazer com ele, já que nenhum thread é realmente bloqueado.

Meu ambiente:

$ java -version
java version "1.7.0_85"
OpenJDK Runtime Environment (IcedTea 2.6.1) (7u85-2.6.1-5ubuntu0.15.04.1)
OpenJDK 64-Bit Server VM (build 24.85-b03, mixed mode)

$ uname -a
Linux pif 3.19.0-31-generic #36-Ubuntu SMP Wed Oct 7 15:04:02 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 15.04
Release:    15.04
Codename:   vivid

Eu dei uma olhada com o VisualVM e notei que o uso da CPU relatado lá (10%) é muito menor que o reportado por top (45%):

Outra coisa que eu tentei foi executá-lo com o Java 8. Nesse caso, o jogo é executado corretamente e o uso da CPU informado por top é de cerca de 20-22% para cada um deles: java , Xorg e compiz .

    
por Cos64 30.10.2015 / 08:08

1 resposta

1

Como você tem o VisualVM sendo executado como um profiler, que é a ferramenta certa para esse trabalho, a ideia é coletar dados suficientes para descobrir onde estão os pontos de acesso.

O sistema está relatando todo o processo Java. As ferramentas de criação de perfil são uma maneira de examinar o trabalho dentro desse processo (e, na verdade, um "processo" não faz sentido para um criador de perfil. Ele está analisando vários encadeamentos e carregadores de classe em uma única instância da JVM).

Como você deseja coletar informações que você pode usar para reportar ao projeto OpenJDK (ou, provavelmente, os autores do jogo), você pode querer experimentar os recursos de "Amostra". A ideia é que nós queremos um instantâneo da atividade ao longo do tempo, provavelmente um número de instantâneos, para que possamos ver quais partes da JVM estavam mais quentes durante o problema identificado que vemos do ponto de vista do sistema.

Dessa forma, podemos ver se são métodos relacionados ao código do jogo ou o código nativo ou não nativo dentro da própria JVM.

(Eu adicionarei que criar perfis de aplicativos em execução é um pouco de arte negra. Meu conselho é ter certeza de que você está realmente olhando para a instância da JVM que você pensa que é, e passar algum tempo com a interface para descobrir o que você As investigações de desempenho geralmente são mais sobre entender o que você está tentando fazer mais do que as informações que você realmente obtém; é sobre certificar-se de que você está fazendo as perguntas certas.

    
por jdv 04.11.2015 / 16:50