Programa Java para preencher deliberadamente o PermGen?

O Glassfish às vezes não consegue parar quando o PermGen está cheio, neste caso o asadmin stop-domain domain1 não funciona. Em Glassfish 2.1.1 seria apenas sentar lá para sempre; em 3.x ele AS_ADMIN_READTIMEOUT após AS_ADMIN_READTIMEOUT . Então, agora estou trabalhando no meu script de parada Glassfish que matará / matará -9 após um certo tempo limite para garantir que ele seja interrompido.

Para testar isso, preciso reproduzir esse cenário completo do PermGen. Como posso deliberadamente preencher o PermGen? Atualmente estou usando o Java 1.7.0_45, se isso é importante. Eu escrevi um programa para preencher o heap, mas este é um novo para mim, eu pensei em voltar para o SO. Pode ser mais complicado (não tenho certeza) que precisa ser algo (a .war?) Que eu possa implantar no GF. Qualquer ajuda é apreciada, muito obrigada.

Eu tenho algo para você. Eu não sei como fazer upload de um arquivo jar aqui apenas adicionando arquivos aqui.

Abordagem: A class ClassGenerator cria um novo carregador de classs em um loop while e carrega a mesma class repetidamente até ficar sem permgen. Agora você notará que há uma lista que mantém uma referência da class carregada. Isso é para evitar que a JVM descarregue essas classs :).

Arquivos explicados
A primeira imagem mostra que quando você executa o programa, ele fica sem espaço no permgen. A segunda imagem mostra a estrutura do projeto, se você quiser configurá-lo no eclipse. Eu testei dentro do eclipse e exportado como um arquivo jar executável que funciona em ambos os casos.

Executar como um arquivo jar executável e ficou sem permgen. O programa ficou sem permgen

Configuração do Projeto Eclipse

insira a descrição da imagem aqui

Classe ClassGenerator

 package com.vkg; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.List; public class ClassGenerator { private static final int BUFFER = 1024; private List> classList = new ArrayList>(); public static void main(String[] args) { ClassGenerator classGenerator = new ClassGenerator(); // Load just some class with class loaders until perm gen space fills. while (true) { classGenerator.classLoader(); } } private void classLoader() { ClassLoader classLoader = new ClassLoader() { public Class loadClass(String classNameWithPackage) throws ClassNotFoundException { if (!classNameWithPackage.contains("DummyClass")) { return super.loadClass(classNameWithPackage); } String className = classNameWithPackage.replace('.', '/') + ".class"; byte[] classData = null; InputStream inputStream = null; try { inputStream = getResourceAsStream(className); byte[] buffer = new byte[BUFFER]; ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); int bytesRead = -1; while ((bytesRead = inputStream.read(buffer, 0, BUFFER)) != -1) { outputStream.write(buffer, 0, bytesRead); } classData = outputStream.toByteArray(); } catch (IOException e) { e.printStackTrace(); } finally { if (inputStream != null) { try { inputStream.close(); } catch (Exception e) { e.printStackTrace(); } } } Class c = defineClass(classNameWithPackage, classData, 0, classData.length); resolveClass(c); System.out .println("Steve I am loading another copy of Dummy class. Soon Permgen will fill."); classList.add(c); return c; } }; try { Class.forName("com.vkg.DummyClass", true, classLoader); } catch (ClassNotFoundException e) { e.printStackTrace(); } } } 

Classe dummy. Isso pode ser qualquer aula. Único propósito desta class é obter um grande número de vezes. Nenhum outro uso. Nenhuma lógica é executada desta class. A lógica principal está em ClassGenerator.java

 package com.vkg; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; public class DummyClass { public void classLoader() { ClassLoader classLoader = new ClassLoader() { public Class loadClass(String classNameWithPackage) throws ClassNotFoundException { if(!classNameWithPackage.contains("DummyClass")) { return super.loadClass(classNameWithPackage); } String className = classNameWithPackage.replace('.', '/') + ".class"; byte[] classData = null; try { InputStream inputStream = getResourceAsStream(className); byte[] buffer = new byte[1]; ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); int bytesRead = -1; while ((bytesRead = inputStream.read(buffer, 0, 1)) != -1) { outputStream.write(buffer, 0, bytesRead); } classData = outputStream.toByteArray(); } catch (IOException e) { e.printStackTrace(); } Class c = defineClass(classNameWithPackage, classData, 0, classData.length); resolveClass(c); System.out.println("Steve I am loading another copy of Dummy class. Soon Permgen will fill."); return c; } }; try { Class.forName("com.vkg.DummyClass", true, classLoader); } catch (ClassNotFoundException e) { e.printStackTrace(); } } } 

Espero que ajude você a testar sua falha no servidor.