【JVM8】堆

本文详细介绍了JVM堆内存的结构、设置、GC机制,特别是年轻代与老年代的分配策略,以及Minor GC、Major GC、Full GC的区别。通过对对象分配内存过程的解析,强调了TLAB在并发分配中的作用。最后,文章探讨了逃逸分析的概念,分析了对象未逃逸时栈上分配的可能性,并展示了如何通过JVM参数调整进行优化。
摘要由CSDN通过智能技术生成

1. 堆的核心概述

  1. 一个进程对应一个JVM实例,一个JVM实例只存在一个堆内存。

  2. java堆区在JVM启动时就被创建,其空间大小就被固定了。

  3. 堆内存大小是可以调节的。

  4. 《Java虚拟机规范》规定,堆可以在物理上不连续空间。但在逻辑上它是连续的。

  5. 所有线程共享Java堆,在这里还可以划分线程私有的缓冲区(Thread Local Allocation Buffer,TLAB)下面第10大点会详细讲到。

  6. 在《Java虚拟机规范》中描述:所i有对象以及数组都对应在运行时分配的堆上。但是有例外,有可能Java虚拟机栈也会存储对象。

  7. 栈帧中保存着的引用会指向对象或者数组在堆中的位置
    在这里插入图片描述

  8. 在方法结束后,堆中的对象不会马上被移除,仅仅在垃圾收集的时候才会被移除。

  9. 堆,是GC(Carbage Collection)执行垃圾回收的重点区域。

堆的核心概述:内存分析

在这里插入图片描述

2.设置堆内存大小与OOM

(1)堆空间大小的设置

  1. 参数为:

“-Xms” :用来设置堆(年轻区+老年区)的初始内存大小。等价于-XX:InitialHeapSize
“-Xmx” :用来设置堆(年轻区+老年区)的最大内存。 等价于-XX:MaxHeapSize
默认情况下:堆的初始内存大小:电脑物理内存的1/64;
默认情况下:堆的最大内存大小:电脑物理内存的1/4;
在开发中我们通常将堆内存初始值和最大值相等;
原因:如果不一样,如果程序运行期间堆内存不够,堆会扩容,从而浪费资源去扩容。

在这里插入图片描述
下面我用堆内存默认设置:我的内存大小为8G

public class HeapSpaceInitial {
   

    public static void main(String[] args) {
   
        //返回Java虚拟机中的初始堆内存总量
        long l = Runtime.getRuntime().totalMemory()/1024/1024;
        //返回Java虚拟机中的最大堆内存总量
        long l1 = Runtime.getRuntime().maxMemory()/1024/1024;
        System.out.println("-Xms : "+l+"M");
        System.out.println("-Xms : "+l1+"M");
    }

}

在这里插入图片描述
看出我们的堆内存初始值为117M小于8G/64;1719M小于8G/4;
原因分析:

  1. 设置参数:

-XX:+PrintGCDetails

在这里插入图片描述
2. 再看运行结果:
在这里插入图片描述
在这里插入图片描述
3.结论:年轻区中有5120k的内存大小没有使用,所以总的空间

(2)OOM(OutOfMemoyr)举例

import java.util.ArrayList;
import java.util.Random;

public class OOMTest {
   
    public static void main(String[] args) {
   
        ArrayList<Picture> list = new ArrayList<>();
        while(true){
   
            try {
   
                Thread.sleep(20);
            } catch (InterruptedException e) {
   
                e.printStackTrace();
            }
            list.add(new Picture(new Random().nextInt
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值