文章目录
一、堆空间的划分和JVM相关参数的解释
Java技术体系中所提倡的自动内存管理最终可以归结为自动化的解决下面两个问题:
- 给对象分配内存空间
- 回收分配给对象的内存
先来看一下在Java 8 之后堆内存在逻辑上的划分:
- 新生代(新生区):PSYoungGen (又分为Eden、from、to)
- 老年代(养老区):ParOldGen
- 元空间:MetaSpace
一起来看看给对象在内存分配空间的过程:
- 对象优先在堆内存的Eden区中分配
- 在后续分配新对的空间时,Eden区如果满了会进行Minor GC,还存活的就会进入新生代中的Survivor区其中的一个
- 如果再次经历垃圾回收时,会将已经存放有数据的幸存者区(Survivor)中的内存区(一般把已经存放了数据的称为from区,空的称为to区)通过复制,全部转移到to区中(会重复此操作)
- 在对象经历一定次数的Minor GC后,就会进入老年代(还有其他特殊的情况也会直接进入老年代)
设置堆内存大小:
Java堆区用于存储Java对象实例,堆的大小在JVM启动的时候就已经设置好了,先来看看默认情况下的内存大小。
默认情况下:
- 初始内存大小:物理电脑内存大小的64分之一(例如我的电脑内存16G,则16 / 64 = 0.25 G)
- 最大内存大小:物理电脑内存大小的四分之一(例如我的电脑内存16G,则16 / 4 = 4 G)
可以设置堆空间(新生代+老年代)的初始内存大小:-Xms
-X
是JVM的运行参数ms
是memory start
可以设置堆空间的最大内存大小: - Xmx
通过下面的代码可以获取默认的初始内存和最大内存的大小
package learn.demo.jvm;
public class HeadSpaceInitial {
public static void main(String[] args) {
long initialMemory = Runtime.getRuntime(