Java虚拟机(二)

4. Java堆

4.1 定义
  • 通过new关键字都会使用堆内存

特点

  • 它是线程共享的, 堆中对象都需要考虑线程安全的问题
  • 有垃圾回收机制
4.2 堆内存溢出
public class Demo_1 {
    public static void main(String[] args) {
        int i=0;
        try{
            List<String> list=new ArrayList<>();
            String a="hello";
            while (true){
                list.add(a);//指数叠加
                a=a+a;
                i++;
            }
        }catch (Throwable e){
            e.printStackTrace();
            System.out.println(i);
        }
    }
}

运行这段代码可以发现报 java.lang.OutOfMemoryError: Java heap space这个错误

这就是堆内存溢出.

4.3 堆内存诊断
  1. jps工具
  • 查看当前系统中有哪些java进程
  1. jmap工具
  • 查看堆内存占用情况, jmap - heap进程id
  1. jconsole工具
  • 图形界面的, 多功能的监测工具, 可以连续监测
  1. jvisualvm工具

​ 下载地址: https://visualvm.github.io/download.html

5. 方法区(Method Area)

5.1 定义

方法区(Method Area)与Java堆一样, 是各个线程共享的内存区域, 它用于存储已被虚拟机加载的类型信息, 常量, 静态变量, 即时编译后的代码缓存等数据.

5.2 组成

在这里插入图片描述

5.3 方法区内存溢出
  • 1.8以前会导致永久代内存溢出

    java.lang.OutOfMemoryError: PermGen space
    
  • 1.8之后会导致元空间内存溢出

    java.lang.OutOfMemoryError: Metaspace
    
5.4 运行时常量池

运行时常量池(Runtime Constant Pool)是方法区的一部分.Class文件中除了有类的版本, 字段, 方法, 接口等信息外, 还有一项是常量池(Constant Pool Table) ,用于存放编译期生成的各种字面量与符号引用, 这部分内容将在加载后存放到方法区的运行时常量池中.

5.5 StringTable
public class Demo_3 {
    public static void main(String[] args) {

        // StringTable["a","b","ab"]

        /**
         * 首先StringTable中存入s1和s2的字符串
         *
         */

        String s1="a";
        String s2="b";
        String s3="ab";//s3 new StringBuilder.append("a").append("b").toString()
                      // 新创建一个new String("ab")在堆中

        String s4=s1+s2;//s4去常量池中器去拿, 创建的ab存入StringTable
        System.out.println(s3==s4);//false
        String s5="ab";
        System.out.println(s3==s5);//true
        String s6=s4.intern();
        System.out.println(s3==s6);//true
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值