Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java程序故意填充PermGen?_Java_Glassfish_Permgen - Fatal编程技术网

Java程序故意填充PermGen?

Java程序故意填充PermGen?,java,glassfish,permgen,Java,Glassfish,Permgen,Glassfish有时无法在PermGen已满时停止,在这种情况下,asadmin stop domain domain1不起作用。在Glassfish 2.1.1中,它将永远坐在那里;在3.x中,它会在之后作为\u ADMIN\u READTIMEOUT超时。因此,我现在正在编写Glassfish停止脚本,该脚本将在某个超时后杀死/杀死-9它,以确保它停止 为了全面测试这一点,我需要复制这个PermGen完整场景我如何故意填充PermGen?如果有必要的话,我目前正在使用Java 1.7.0_

Glassfish有时无法在PermGen已满时停止,在这种情况下,
asadmin stop domain domain1
不起作用。在Glassfish 2.1.1中,它将永远坐在那里;在3.x中,它会在
之后作为\u ADMIN\u READTIMEOUT
超时。因此,我现在正在编写Glassfish停止脚本,该脚本将在某个超时后杀死/杀死-9它,以确保它停止


为了全面测试这一点,我需要复制这个PermGen完整场景我如何故意填充PermGen?如果有必要的话,我目前正在使用Java 1.7.0_45。我已经写了一个程序来填充堆,但这对我来说是一个新的程序,我想我会这样做。可能更棘手(不确定)的是,它需要某种我可以部署到GF中的东西(战争?)。非常感谢您的帮助。

我有些东西要给您。我不知道如何在这里上传jar文件,所以只需在这里添加文件即可

方法:ClassGenerator类在while循环中创建一个新的类加载器,并反复加载同一个类,直到用完permgen。现在,您将注意到有一个列表保存了加载类的引用。这是为了防止JVM卸载这些类:)

已解释的文件
第一幅图显示,当您运行程序时,它会耗尽permgen空间。第二幅图显示了在eclipse中设置项目的结构。我在eclipse中对其进行了测试,并将其导出为一个可运行的jar文件,在这两种情况下都可以运行

作为可运行的jar文件运行,但permgen已用完。

Eclipse项目设置

类生成器类

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<Class<?>> classList = new ArrayList<Class<?>>();

    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();
        }
    }
}
package com.vkg;
导入java.io.ByteArrayOutputStream;
导入java.io.IOException;
导入java.io.InputStream;
导入java.util.ArrayList;
导入java.util.List;
公共类生成器{
专用静态最终整数缓冲区=1024;
私有列表>();
公共静态void main(字符串[]args){
ClassGenerator ClassGenerator=新的ClassGenerator();
//用类加载器加载一些类,直到perm gen空间填满为止。
while(true){
classGenerator.classLoader();
}
}
私有void类加载器(){
ClassLoader ClassLoader=新的ClassLoader(){
公共类loadClass(字符串classNameWithPackage)
抛出ClassNotFoundException{
如果(!classNameWithPackage.contains(“DummyClass”)){
返回super.loadClass(classNameWithPackage);
}
字符串className=classNameWithPackage.replace('.','/'))
+“.class”;
字节[]classData=null;
InputStream InputStream=null;
试一试{
inputStream=getResourceAsStream(类名);
字节[]缓冲区=新字节[缓冲区];
ByteArrayOutputStream outputStream=新建ByteArrayOutputStream();
int字节读取=-1;
while((bytesRead=inputStream.read(buffer,0,buffer))!=-1){
写入(缓冲区,0,字节读取);
}
classData=outputStream.toByteArray();
}捕获(IOE异常){
e、 printStackTrace();
}最后{
如果(inputStream!=null){
试一试{
inputStream.close();
}捕获(例外e){
e、 printStackTrace();
}
}
}
c类=定义类(classNameWithPackage,classData,0,
classData.length);
(c)级;
系统输出
.println(“Steve我正在加载另一个Dummy类的副本。很快Permgen将填充”);
添加(c);
返回c;
}
};
试一试{
Class.forName(“com.vkg.DummyClass”,true,classLoader);
}catch(classnotfounde异常){
e、 printStackTrace();
}
}
}
虚拟类。这可以是任何类。此类的唯一目的是获得大量加载。没有其他用途。没有从这个类执行任何逻辑。主逻辑在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();
        }
    }
}
package com.vkg;
导入java.io.ByteArrayOutputStream;
导入java.io.IOException;
导入java.io.InputStream;
公共类DummyClass{
公共void类加载器(){
ClassLoader ClassLoader=新的ClassLoader(){
公共类loadClass(字符串classNameWithPackage)引发ClassNotFoundException{
如果(!classNameWithPackage.contains(“DummyClass”)){
返回super.loadClass(classNameWithPackage);
} 
字符串className=classNameWithPackage.replace('.','/')+“.class”;
字节[]classData=null;
试一试{
InputStream InputStream=getResourceAsStream(类名);
字节[]缓冲区=新字节[1];
ByteArrayOutputStream outputStream=新建ByteArrayOutputStream();
int字节读取=-1;
while((bytesRead=inputStream.read(缓冲区,0,1))!=-1){
写入(缓冲区,0,字节读取);
}
classData=outputStream.toByteArray();
}
捕获(IOE异常){
e、 printStackTrace();
}
c类=定义类(classNameWithPackage,classData,0,classData.length);
(c)级;
System.out.println(“Steve我正在加载另一个Dummy类的副本。很快Permgen就会填充它”);
返回c;
}