- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
当 PermGen 已满时,Glassfish 有时无法停止,在这种情况下 asadmin stop-domain domain1
不起作用。在 Glassfish 2.1.1 中,它会永远坐在那里;在 3.x 中,它在 AS_ADMIN_READTIMEOUT
后超时。所以我现在正在开发我的 Glassfish 停止脚本,该脚本将在一定的超时后杀死/杀死 -9 以保证它被停止。
为了全面测试这个,我需要重现这个 PermGen 的完整场景。 如何故意填充 PermGen?如果重要的话,我目前正在使用 Java 1.7.0_45。我已经编写了一个程序来填充堆,但这对我来说是一个新程序,我想我会求助于 SO。它可能更棘手(不确定)它需要是我可以部署到 GF 中的东西(.war?)。感谢任何帮助,非常感谢。
最佳答案
我有东西要给你。我不知道如何在这里上传 jar 文件,所以只在这里添加文件。
方法: ClassGenerator 类在 while 循环中创建一个新的类加载器,并一遍又一遍地加载相同的类,直到用完 permgen。现在您会注意到有一个列表保留了已加载类的引用。那是为了防止 JVM 卸载那些类:)。
文件说明
第一张图片显示,当您运行该程序时,它会用完 permgen 空间。如果你想在 Eclipse 中设置它,第二张图片显示了项目的结构。我在 eclipse 中对其进行了测试,并将其导出为可运行的 jar 文件,它在这两种情况下都适用。
作为可运行的 jar 文件运行,它用完了 permgen。
Eclipse 项目设置
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<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();
}
}
}
虚拟类。这可以是任何类。此类的唯一目的是多次加载。没有别的用处。此类不执行任何逻辑。主要逻辑在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();
}
}
}
希望它能帮助您测试服务器崩溃。
关于Java程序故意填满PermGen?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23415288/
我正在运行 Play! 2.3 使用 Akka 的多线程应用程序。每个线程访问 MySQL 数据库并运行一些计算。每次我运行一组这样的任务时,应用程序的内存占用量都会增加,这主要是由于 JDBC4Pr
我是 JavaScript 新手,正在尝试实现选择排序来亲自接触数组(注意:我知道有一个内置的排序函数)。不过,我遇到了一些奇怪的行为。 这是我的代码: function selectionSort(
我正在使用 unsemantic grid创建我的布局。好吧,我有一个容器,其中有一个标签和一个输入文本。标签的宽度为 20% 然后 margin-rightof 1em 然后我想让容器中的其余空间由
看看这张取自 morsmachine.dk/go-scheduler 的著名图片 灰名单是 P 的本地运行队列。如果此队列变空,它们将被全局运行队列中的 go routines 填充。 问题是,谁来填
(帖子创建于 2016 年 10 月 5 日) 我注意到每次运行图像并删除它时,我的系统都不会恢复到原来的可用空间量。 我应用于容器的生命周期是: > docker build ... > docke
我有一个应用程序,它在启动时运行两个或三个完整的 GC。有很多堆空间,不需要运行任何 GC(minor 或 full)。然而,在 gc 日志中,我可以看到 permgen 被填满,然后立即运行完整
我正在尝试制作可视化 VStack 属性的 VStack 示例应用 但是我的 VStack 无法填满屏幕的宽度 我在互联网上尝试了很多解决方案(frame modifier、HStack with S
[已解决] 所以我在页面顶部有一个高度恒定的 div,我希望在它下面有一个 iFrame 来填充页面的其余部分。 Google Images 和 LinkedIn 做的事情非常相似 参见:http:/
我正在尝试使我的标题框与我的图像大小相同,同时又不失去 flex-slider 的响应能力,有什么建议吗? http://jsfiddle.net/bmBnF/10/ 疯狂的K 最佳答案 我通过将其设
我有一个元素是 的兄弟元素动态填充 hello 我想要 固定在屏幕底部直到动态 s 要求将其向下推到 View 下方。 我尝试了以下但无法获得我想要的结果。 该元素位
我是一名优秀的程序员,十分优秀!