码迷,mamicode.com
首页 > 其他好文 > 详细

JVM运行时数据区--堆

时间:2020-07-15 12:57:51      阅读:71      评论:0      收藏:0      [点我收藏+]

标签:buffer   exception   分配   collect   show   计数器   code   缓冲区   oid   

一个进程对应一个jvm实例,一个运行时数据区,又包含多个线程,这些线程共享了方法区和堆,每个线程包含了程序计数器、本地方法栈和虚拟机栈。

核心概述

1.一个jvm实例只存在一个堆内存,堆也是java内存管理的核心区域

2.Java堆区在JVM启动的时候即被创建,其空间大小也就确定了。是JVM管理的最大一块内存空间(堆内存的大小是可以调节的)

3.《Java虚拟机规范》规定,堆可以处于物理上不连续的内存空间中,但在逻辑上它应该被视为连续的。

4.所有的线程共享java堆,在这里还可以划分线程私有的缓冲区(TLAB:Thread Local Allocation Buffer).(面试问题:堆空间一定是所有线程共享的么?不是,TLAB线程在堆中独有的)

5.《Java虚拟机规范》中对java堆的描述是:所有的对象实例以及数组都应当在运行时分配在堆上。从实际使用的角度看,“几乎”所有的对象的实例都在这里分配内存 (‘几乎’是因为可能存储在栈上,另见逃逸分析)

6。数组或对象永远不会存储在栈上,因为栈帧中保存引用,这个引用指向对象或者数组在堆中的位置。

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

8.堆,是GC(Garbage Collection,垃圾收集器)执行垃圾回收的重点区域

配置堆内存及查看jvm进程

编写HeapDemo/HeapDemo1代码:

public class HeapDemo {
    public static void main(String[] args) {
        System.out.println("start...");
        try {
            Thread.sleep(1000000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("end...");
    }
}

首先对虚拟机进行配置,如图 Run-Edit configurations:

技术图片

在jdk目录,jdk1.8.0_171.jdk/Contents/Home/bin下找到jvisualvm 运行(或者直接终端运行jvisualvm),查看进程,可以看到我们设置的配置信息:
技术图片

 可以看到HeapDemo配置-Xms10m, 分配的10m被分配给了新生代3m和老年代7m:

技术图片

 分析SimpleHeap的jvm情况

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 sl = new SimpleHeap(1);
        SimpleHeap s2 = new SimpleHeap(2);

        int[] arr = new int[10];

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

技术图片

 

 


 

 

JVM运行时数据区--堆

标签:buffer   exception   分配   collect   show   计数器   code   缓冲区   oid   

原文地址:https://www.cnblogs.com/yanl55555/p/13304652.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!