java 获取permgen_Java程序故意填写PermGen?
当PermGen已满时,Glassfish有时无法停止,在这种情况下,asadmin stop-domain domain1不起作用.在Glassfish 2.1.1中它会永远坐在那里;在3.x中,它在AS_ADMIN_READTIMEOUT之后超时.所以我现在正在研究我的Glassfish停止脚本,它将在一定的超时后杀死/杀死它 – 以确保它被停止.
为了完全测试这个,我需要重现这个PermGen完整场景.我怎么刻意填写PermGen?我现在正在使用Java 1.7.0_45,如果这很重要的话.我写了一个程序来填满堆,但对我来说这是一个新的程序,我想我会转向SO.它可能更棘手(不确定)它需要是什么(.war?)我可以部署到GF.感谢任何帮助,非常感谢.
解决方法:
我有东西给你.我不知道如何在这里上传jar文件,所以只需在这里添加文件.
方法:ClassGenerator类在while循环中创建一个新的类加载器,并反复加载相同的类,直到它用完permgen.现在您将注意到有一个列表可以保存已加载类的引用.那是为了防止JVM卸载这些类:).
文件说明
第一张图显示,当您运行程序时,它会耗尽permgen空间.如果要在eclipse中设置它,则第二个图像显示项目的结构.我在eclipse中测试它并将其导出为可运行的jar文件,它在两种情况下均可用.
作为一个可运行的jar文件运行,它用完了permgen.
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();
}
}
}
虚拟课.这可以是任何类.这个类的唯一目的是获得大量加载.没有其他用途.没有逻辑从这个类执行.主要逻辑在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,glassfish
来源: https://codeday.me/bug/20190528/1174063.html
java 获取permgen_Java程序故意填写PermGen?相关推荐
- java 获取permgen_java - Java:如何检查当前的Perm / PermGen大小? - 堆栈内存溢出
您可以在这里使用jmap ,它是JVM堆转储工具. 例如: jmap -heap 5900 它将打印: Heap Configuration: MinHeapFreeRatio = 40 MaxHea ...
- java 获取permgen_java – 如何查看PermGen中存储的确切内容?
在我的应用程序中,我有一个PermGen内存不足错误,我想知道导致它的原因. 我通过VisualVM连接到我的应用程序. 我想知道在我的应用程序中究竟消耗了如此多的PermGen内存,但我无法在Vis ...
- java 获取permgen_java permgen内存泄漏问题处理
来自:http://longtask.com/review/2014/06/07/java-permgen-outofmemory/ 工作以来,第三次出现内存溢出,第一次是ThreadLocal没有r ...
- MMJ-Spring Boot(Java)获取小程序Openid
背景 开发小程序,想使用微信账号唯一码,API是这么说的 wx.login... code 换取 session_key 接口地址: https://api.weixin.qq.com/sns/jsc ...
- java获取小程序中用户的unionId的三种方式
前提条件: 想要获取unionId,必须几个小程序或者公众号在同一个主体之下,要不然没有unionId,只会生成用户的openid,可登陆下面这个微信官方平台查看 https://open.weixi ...
- java获取文件大小_Java获取文件大小
java获取文件大小 Today we will look into different ways to get file size in Java. 今天,我们将研究使用Java获取文件大小的不同方 ...
- 在Java后台获取小程序的小程序码,传递到前端显示图片
步骤: 1.需要准备的参数 accessToken :小程序的临时凭证,需要它才可以任意的调用小程序的各种接口 appid:小程序的ID,微信公众平台上有.为了获取accessToken 而存在 se ...
- java获取微信小程序二维码图片并保存到本地
java获取微信小程序二维码保存到本地并返回图片,下次如果检查到本地有图片,那么就返回本地的图片,不再发起请求,否则重新发起请求并保存到本地,直接看代码吧. 获取access_token的方法可以参考 ...
- java学习(177):获取应用程序的路径
import javax.tools.Tool; import java.net.URLDecoder;//获取类路径 public final class test132 {public stati ...
最新文章
- javascript之DOM总结
- BugkuCTF-MISC题神奇宝贝
- 在Eclipse中使用CVS的实践建议
- CentOS6.5下安装iRedMail中需要解决的问题
- 开发环境配置--Ubuntu+Qt4+OpenCV(二)
- mysql连表查询最大值_SQL 两个表联合查询记录中取最大值
- Vim编辑器运用的五个技巧
- Server、Service和Servlet的区分
- iOS知识点汇总复习
- html相册代码大全
- 数据库设计(电商平台)
- 稳坐全球第一的小米手环,爆款背后的“护城河”是如何造就的?
- 神经网络的基本构成要素,构成神经网络的三要素
- 《单片机原理及应用》(B)课程教学大纲
- 01 将狼才鲸的嵌入式开源项目仓库链接
- POJ2262 java
- 金山快盘 android,随时随地的存储 金山快盘Android版评测
- 经典网页布局浮动广告
- db2case语句_SQL中的IF ELSE(CASE语句的使用)
- 解决sockjs.js?9be2:1609 GET http://192.168.2.119:8081/sockjs-node/info?t=1643074975460 net::ERR_CONNEC