zoukankan      html  css  js  c++  java
  • 堆内存的初步诊断

      我们知道堆中存放的是对象,对象不被引用就会被垃圾收集回收掉。但是如果对象一直存在强引用,那么就会一直存活,当存活对象达到一定数量时,就会把堆内存占满,从而发生堆内存溢出错误。比如有这样一段代码:逻辑是每次都往集合中添加一个字符串对象,然后字符串进行一次拼接。

    public class Demo1 {
        public static void main(String[] args) {
            int count = 0;
            StringBuilder sb = new StringBuilder();
            List<String> list = new ArrayList<>();
            String a = "hello";
            try {
                while (true) {
                    list.add(a);
                    sb.append(a);
                    count++; 
                }
            } catch (Throwable e) {
                e.printStackTrace();
                System.out.printf("count: %d", count);
            }
        }
    }

    运行一会后报错:“java.lang.OutOfMemoryError: Java heap space”

    我们用参数 -Xmx 对堆内存进行设置再运行下程序,同样的错误,只不过循环次数变少了。

    我们可以在控制台输入命令 “jvisualvm”来查看堆内存的变化,要在Java VisualVM 中安装Visual GC 插件。运行某个java程序,点击左边的进程就可以查看堆内存各个区的变化了。

  • 相关阅读:
    MVC学习
    Net开源网络爬虫
    js调用wcf 的SOA
    Redis 上实现的分布式锁
    dojo/request
    Python,PyCharm
    如何解决卸载McAfee时出现“处于托管模式时无法删除”问题(转)
    糗事⊙︿⊙
    Oracle exp,imp
    java 生产者消费者问题 并发问题的解决(转)
  • 原文地址:https://www.cnblogs.com/fly-bryant/p/13281250.html
Copyright © 2011-2022 走看看