首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何重现超出Java OutOfMemoryError - GC开销限制

如何重现超出Java OutOfMemoryError - GC开销限制
EN

Stack Overflow用户
提问于 2013-06-15 00:09:19
回答 2查看 5.8K关注 0票数 17

我的方法是创建数十万个本地集合,并用随机字符串填充它们,如下所示:

代码语言:javascript
复制
    SecureRandom random = new SecureRandom();
    for(int i = 0 ; i < 100000 ; i++){
        HashMap<String, String> map = new HashMap<String, String>();
        for(int j = 0 ; j < 30 ; j++){
            map.put(new BigInteger(130, random).toString(32), new BigInteger(130, random).toString(32));
        }
    }

我也提供了-XX:+UseGCOverheadLimit jvm参数,但不能得到错误。有没有什么简单可靠的方法/黑客来获取这个错误?

EN

回答 2

Stack Overflow用户

发布于 2013-06-15 00:11:13

这一点:

代码语言:javascript
复制
HashMap<String, String> map = new HashMap<String, String>();

在循环内限定作用域,并且在循环迭代时不存在对映射的外部(长期)引用。因此,在每次循环迭代结束时,每个map都有资格进行垃圾回收。

您需要在循环外部创建一个对象集合,并使用该循环填充该集合。

票数 2
EN

Stack Overflow用户

发布于 2013-06-15 00:23:34

我想这应该能起到作用。如果您运行的时间足够长:

代码语言:javascript
复制
HashMap<Long, String> map = new HashMap<Long, String>();
for (long i = 0; true; i++) {
    for (int j = 0; j < 100; j++) {
        String s = "" + j;
        map.put(i, s);
    }
}

我正在做的是慢慢增加非垃圾的数量,同时创建大量的垃圾。如果一直运行,直到非垃圾填满了几乎所有的堆,GC将达到垃圾收集所花费的时间百分比超过阈值的程度。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17112827

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档