JVM学习总结——JVM的运行时数据区(堆)(博客资料来源于尚硅谷,感谢!)

1、堆空间的核心概述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
分析演示实例:
代码块:

public class SimpleHeap {
    private int id;

    public SimpleHeap(int id) {
        this.id = id;
    }

    public void show(){
        System.out.println("my id is "+id);
    }

    public static void main(String[] args) {
        SimpleHeap s1 = new SimpleHeap(1);
        SimpleHeap s2 = new SimpleHeap(2);
        int[] arr = new int[10];

        Object[] arr1 = new Object[10];
    }
}

对应的字节码分析:

在这里插入图片描述
在这里插入图片描述
堆空间的内部结构:
在这里插入图片描述
查看堆空间的具体细节:首先在运行的java程序进行虚拟机配置,配置参数:-XX:+PrintGCDetails,表示打印GC的具体细节,此后每次进行垃圾回收的时候,都会对堆空间中的新生代,老年代和元空间进行垃圾回收,并打印出回收日志信息。
在这里插入图片描述
在这里插入图片描述
从打印出来的GC日志信息可以看出,堆空间中包含了逻辑上的新生代、老年代和元空间,而新生代中又可以分为三个区域:伊甸园区、幸存者0区(from区)和幸存者1区(to区)。

2、设置堆内存大小和OOM(OutOfMemory:内存溢出)

在这里插入图片描述
手动设置堆的空间大小:
-Xms2g -Xmx2g:代表我们将初始堆内存和最大堆内存都设置为2g,在实际的开发中,都是将初始的堆内存和最大堆内存设置为一样的,如果不一样的话,导致堆内存进行频繁的进行扩容和缩减,系统压力增加。

OOM演示:OutOfMemoryError(内存溢出异常)

代码:

public class OutOfMemoryTest {
    public static void main(String[] args) {
        List<Person> list = new ArrayList<>();
        while(true){
            list.add(new Person(1));
        }
    }
}

class Person{
    private int id;

    public Person(int id) {
        this.id = id;
    }
}

垃圾回收器(GC)的日志信息:
在这里插入图片描述
垃圾回收器会在新生代进行YoungGC(轻GC),以及在老年代进行OldGC(重GC),在这个演示的代码中,gc在垃圾回收的时候,发现不管自己怎么进行垃圾回收,最终都回收不赢在堆内存创建对象的过程,导致堆内存溢出的问题。
在这里插入图片描述
3、年轻代和老年代
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
特别注意:在JVM官方文档中,规定了伊甸园区和幸存者0区(from区)和幸存者1区(to区)的占用大小为:8:1:1,可以通过-XX:SurvivorRatio这个参数进行调整比例,但是,通过参数查看可以计算得出实际上的比例不是默认的8:1:1,需要明确指出这个比值,-XX:SurvivorRatio=8,才能生效。
-XX:-UseAdaptiveSizePolicy:关闭自适应的内存分配策略。当需要开启自适应分配策略的时候就是:-XX:+UseAdaptiveSizePolicy
-Xmn:设置新生代的空间大小(一般不使用这个设置新生代的大小,都是通过NewRatio这个设置新生代和老年代的比例)

4、对象分配的过程
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
5、Minor GC、Major GC 、Full GC

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

6、堆空间的分代思想

在这里插入图片描述
在这里插入图片描述
7、内存分配策略

在这里插入图片描述
在这里插入图片描述
8、为对象分配内存
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
9、堆空间的参数总结

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
10、堆是分配对象存储的唯一选择吗?

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

总结堆空间是对象分配的唯一方式,虽然我们可以通过开启逃逸分析让只在方法内部被使用的对象(未发生逃逸的对象)分配在栈上,但是这个过程实际上是标量替换/对象分离的方式实现的,使得对象被分解成标量存储在栈空间,实际上对象并不是以完整的形式存在在栈空间的。因为对象要能完整保存只有保存在堆空间。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JVM内存模型是Java虚拟机在运行所使用的内存分配和管理方式。它包括了运行数据,也就是JVM在内存中划分的不同域,用来存储程序的数据和指令。 JVM运行数据主要包括以下几个部分: 1. 堆(Heap):用于存储对象实例和数组。堆是线程共享的域,所有线程共同使用堆来创建和访问对象。 2. 方法(Method Area):用于存储已加载的类信息、常量、静态变量和编译后的代码等。方法也是线程共享的域,它在内存中占用一块连续的空间。 3. 虚拟机栈(VM Stack):每个线程在创建都会分配一个虚拟机栈,用来存储局部变量和方法调用信息。虚拟机栈是线程私有的,每个线程都有自己独立的虚拟机栈。 4. 本地方法栈(Native Method Stack):与虚拟机栈类似,用于存储本地方法调用的相关信息。 5. 程序计数器(Program Counter Register):用于存储当前线程执行的字节码指令的地址。 这些不同的运行数据JVM内存模型中起着不同的作用,可以提供给程序运行所需的各种资源和环境。例如,堆用于存储对象实例,方法用于存储类信息和静态变量,虚拟机栈用于存储方法的局部变量和方法调用信息等。 总的来说,JVM内存模型和运行数据是Java虚拟机在运行所使用的内存管理和分配方式。它们的不同域有不同的作用,用来存储程序的数据和指令。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [运行数据JVM内存模型](https://blog.csdn.net/weixin_45659364/article/details/124027073)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [JVM:Java内存模型与运行数据域](https://blog.csdn.net/m0_71777195/article/details/131655107)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [Java内存模型与JVM运行数据别详解](https://download.csdn.net/download/weixin_38648037/12745990)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值