堆(一)
一、堆的核心概述
堆的特点:
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,垃圾收集器)执行垃圾回收的重点区域
二、堆的细分内存结构
Java8以后,永久区变成了元空间
1.堆空间大小设置
1.默认堆空间大小
初始内存大小:物理电脑内存大小/64
最大内存大小:物理电脑内存大小/4
2.设置堆空间大小
堆空间初始大小就是年轻代+老年代的内存大小
-
-Xms 用来设置堆空间的初始内存大小,等价于 -XX:InitialHeapSize
-X是jvm的运行参数
mx是是memory start
-
-Xmx 用于设置堆的最大内存,等价于 -XX:MaxHeapSize
3.手动设置
开发中建议将初始堆的内存和最大堆内存设置成同样的值,否则在扩展内存的时候GC会影响系统性能。
4.查看设置的参数
设置堆大小为600m
方式1:
jps 查询进程
jstat -gc 进程id 查询该进程的堆设置状况
方式2: