堆的核心概述
- 一个进程对应一份方法区和堆及JVM实例,一个进程中有多个线程,每个线程都有自己的程序计数器、虚拟机栈、本地方法区。
堆空间的核心概述:
- 注意,堆空间中并不是所有内容都是共享的,在TLAB中的内容是每个线程一份,线程私有的。
- 几乎所有的对象实例及数组都分配在堆上,由于后期JVM迭代优化,出现了逃逸分析等,会存在在栈上分配的情形。
- 方法结束后,对应方法的栈帧从栈中弹出,此时该引用指向堆中的空间不会立刻消失,而是等到GC时,再回收。
堆的内存细分:
Java7及以前版本堆在内存逻辑上分为:新生区+养老区+永久区
Java8及以后堆在内存逻辑上分为:新生区+养老区+元空间
设置堆空间的大小:
- -Xms:用来设置堆空间(新生代+老年代)的初始内存大小
-X 是JVM的运行参数
ms 是memory start
- -Xmx:用来设置堆空间(新生代+老年代)的最大内存大小
- 默认堆空间的大小:
初始内存大小: 物理电脑内存/64
最大内存大小: 物理电脑内存/4
- 开发中建议将初始堆内存和最大堆内存设置为相同的值
- 查看设置的参数:
方式1: 使用cmd命令行【1】jps 【2】jstat -gc 进程id
方式2:-XX:PrintGCDetails