【基础篇】十、JVM堆 && 直接内存

运行时数据区域,还有两组成部分:堆和方法区,和栈、程序计数器不同,它们是线程共享的

在这里插入图片描述

一、堆

1、堆heap

  • 堆内存是线程共享的
  • 创建出来的对象存于堆内存

如图:栈里的局部变量中存了堆上对象的引用:

在这里插入图片描述

2、堆溢出

ArrayList<Object> list = new ArrayList<>();
while (true) {
   
    list.add(new byte[1024 * 1024]);
}

一直new对象往堆里放,最终达到堆内存上限值后堆内存溢出OutOfMemory:Java heap space

在这里插入图片描述

3、used、total、max

  • used:已使用的堆内存
  • total:可用堆内存大小
  • max:最大可分配的堆内存
    在这里插入图片描述

调整下上面的代码:

ArrayList<Object> list = new ArrayList<>();
while (true) {
   
    System.in.read();
    System.out.println("往堆中放入一次...");
    list.add(new byte[1024 * 1024 * 10]);
}

使用阿尔萨斯工具来看JVM信息:

dashboard -i 刷新频率(毫秒)

或者直接使用memory只查看内存:

memory

随着堆中对象变多,used即将达到total时,total值变大,但最大只能到与max相等:

在这里插入图片描述
在这里插入图片描述

并不是当used = max = total的时候,堆内存就溢出了!! 这和垃圾回收有关。

4、设置堆内存大小

添加虚拟机参数:

-Xmx-Xms//eg:
-Xmx1g -Xms1g

在Dockerfile中可写:

ENV JAVA_OPTS="-Xms512m -Xmx512m "

其中:

  • –Xmx是max最大值,-Xms 是初始的total
  • 单位默认字节byte且是1024的倍数,可k或者K(KB)、m或者M(MB)、g或者G(GB)
  • 限制Xmx必须大于 2 MB,Xms必须大于1MB

在这里插入图片描述
开发中,把-Xmx和-Xms设为相同的值,如此,程序启动后的可用内存就是最大内存,无需向JVM频繁申请,以减少申请内存的时间开销。

二、直接内存

直接内存不属于Java运行时的内存区域,用途:

  • Java堆中的对象如果不再使用要回收,回收时会影响对象的创建和使用

  • 普通IO,是文件先读到内存(缓存区),再复制到JVM堆中。引入直接内存则不用复制这一步,直接让堆中存一个引用
    在这里插入图片描述

  • JDK8及以后,存方法区的数据

使用ByteBuffer创建直接内存上的数据:

public class Demo2 {
   

    public static int size = 1024 * 1024 * 100;
    public static List<ByteBuffer> list = new ArrayList<>();
    public static int count = 0;

    public static void main(String[] args) throws Exception {
   
        System.in.read();
        while(true){
   
            ByteBuffer directSpace = ByteBuffer.allocateDirect(size);
            list.add(directSpace);
            System.out.println(++count);
            Thread.sleep(5000);
        }
    }
}

阿尔萨斯查看:

在这里插入图片描述

修改直接内存的上限:

-XX:MaxDirectMemorySize=大小

//eg:-XX:MaxDirectMemorySize=300m

出现直接内存溢出:

在这里插入图片描述

相关推荐

  1. 栈内存和

    2024-01-07 13:24:01       18 阅读
  2. 第七讲 对象的基本组成-引用-栈内存-

    2024-01-07 13:24:01       17 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-07 13:24:01       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-07 13:24:01       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-07 13:24:01       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-07 13:24:01       20 阅读

热门阅读

  1. 怎么给服务器再额外附加一个 IP ?

    2024-01-07 13:24:01       36 阅读
  2. 嵌入式Linux之Ubuntu学习笔记(压缩与解压缩)

    2024-01-07 13:24:01       36 阅读
  3. 一个人能不能快速搭建一套微服务环境

    2024-01-07 13:24:01       56 阅读
  4. C++关联容器

    2024-01-07 13:24:01       38 阅读
  5. MySQL学习笔记1: 数据库的简单介绍

    2024-01-07 13:24:01       37 阅读
  6. vue 使用 splice 删除元素UI视图不同步怎么办?

    2024-01-07 13:24:01       31 阅读
  7. Linux C语言 46-正则表达式

    2024-01-07 13:24:01       29 阅读
  8. go 语言中的类型判断

    2024-01-07 13:24:01       43 阅读
  9. keil 5 armlink 链接错误和警告解释大全

    2024-01-07 13:24:01       36 阅读
  10. C#-词法结构

    2024-01-07 13:24:01       32 阅读
  11. STM32 FOC算法调节电机

    2024-01-07 13:24:01       38 阅读