当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?相关推荐

  1. java 获取permgen_java - Java:如何检查当前的Perm / PermGen大小? - 堆栈内存溢出

    您可以在这里使用jmap ,它是JVM堆转储工具. 例如: jmap -heap 5900 它将打印: Heap Configuration: MinHeapFreeRatio = 40 MaxHea ...

  2. java 获取permgen_java – 如何查看PermGen中存储的确切内容?

    在我的应用程序中,我有一个PermGen内存不足错误,我想知道导致它的原因. 我通过VisualVM连接到我的应用程序. 我想知道在我的应用程序中究竟消耗了如此多的PermGen内存,但我无法在Vis ...

  3. java 获取permgen_java permgen内存泄漏问题处理

    来自:http://longtask.com/review/2014/06/07/java-permgen-outofmemory/ 工作以来,第三次出现内存溢出,第一次是ThreadLocal没有r ...

  4. MMJ-Spring Boot(Java)获取小程序Openid

    背景 开发小程序,想使用微信账号唯一码,API是这么说的 wx.login... code 换取 session_key 接口地址: https://api.weixin.qq.com/sns/jsc ...

  5. java获取小程序中用户的unionId的三种方式

    前提条件: 想要获取unionId,必须几个小程序或者公众号在同一个主体之下,要不然没有unionId,只会生成用户的openid,可登陆下面这个微信官方平台查看 https://open.weixi ...

  6. java获取文件大小_Java获取文件大小

    java获取文件大小 Today we will look into different ways to get file size in Java. 今天,我们将研究使用Java获取文件大小的不同方 ...

  7. 在Java后台获取小程序的小程序码,传递到前端显示图片

    步骤: 1.需要准备的参数 accessToken :小程序的临时凭证,需要它才可以任意的调用小程序的各种接口 appid:小程序的ID,微信公众平台上有.为了获取accessToken 而存在 se ...

  8. java获取微信小程序二维码图片并保存到本地

    java获取微信小程序二维码保存到本地并返回图片,下次如果检查到本地有图片,那么就返回本地的图片,不再发起请求,否则重新发起请求并保存到本地,直接看代码吧. 获取access_token的方法可以参考 ...

  9. java学习(177):获取应用程序的路径

    import javax.tools.Tool; import java.net.URLDecoder;//获取类路径 public final class test132 {public stati ...

最新文章

  1. javascript之DOM总结
  2. BugkuCTF-MISC题神奇宝贝
  3. 在Eclipse中使用CVS的实践建议
  4. CentOS6.5下安装iRedMail中需要解决的问题
  5. 开发环境配置--Ubuntu+Qt4+OpenCV(二)
  6. mysql连表查询最大值_SQL 两个表联合查询记录中取最大值
  7. Vim编辑器运用的五个技巧
  8. Server、Service和Servlet的区分
  9. iOS知识点汇总复习
  10. html相册代码大全
  11. 数据库设计(电商平台)
  12. 稳坐全球第一的小米手环,爆款背后的“护城河”是如何造就的?
  13. 神经网络的基本构成要素,构成神经网络的三要素
  14. 《单片机原理及应用》(B)课程教学大纲
  15. 01 将狼才鲸的嵌入式开源项目仓库链接
  16. POJ2262 java
  17. 金山快盘 android,随时随地的存储 金山快盘Android版评测
  18. 经典网页布局浮动广告
  19. db2case语句_SQL中的IF ELSE(CASE语句的使用)
  20. 解决sockjs.js?9be2:1609 GET http://192.168.2.119:8081/sockjs-node/info?t=1643074975460 net::ERR_CONNEC

热门文章

  1. @jsonignore的使用
  2. N97连接WIFI提示预置共享密钥无效
  3. 一个 HTTP 打趴 80% 面试者
  4. PHP编写商品打折,php打折
  5. Python中自定义函数的方法
  6. apple企业开发账号的用途
  7. 【WebRTC】拥塞控制 GCC 类图
  8. 为化工厂量身打造数字化应急管理解决方案
  9. Micro Services
  10. shell程序中 2> /dev/null 代表什么意思?