JVM内存结构大致如下图
大致可以分为三大类:
- 堆内存:可以细分为新生代和老年代,新生代可以再细分为Eden区,From survivor区和To survivor区
- 方法区:也称为永久代,主要用于存储虚拟机加载的类信息,常量,静态变量,是所有线程共享的内存区域,JDK8之前永久代是一片连续的堆空间,JVM启动前通过参数-XX: MaxPermSize配置,JDK8之后取消了永久代,但是类的元信息还在,也不再存储再连续的堆空间上,被移动到了Metaspace的本地内存上
- 栈内存:可以再细分为java虚拟机栈和本地方法栈
1.堆内存
java堆是JVM中最大的一块内存区域,堆是所有线程共享的一块区域,在JVM启动时创建,存放几乎所有的实例对象(new 出来的),new对象时为对象分配内存.
堆内存分为年轻带和老年代,GC主要回收的也就是堆区.JDK1.8后永久代(perm)删除,新生代和老年代的比例是1:2,
可以通过-XX:NewRatio指定比例
年轻代区域又可以细分为Eden区和From survivor 和To survivor,比例一般情况下是Eden:s0:s1 = 8:1:1,
可以通过-XX:SurvivorRatior设置比例
2.虚拟机栈
java 虚拟机栈是线程私有的,生命周期同线程的生命周期,创建线程的时候就会创建虚拟机栈,虚拟机执行java程序时,每个方法都会创建一个栈帧,栈帧存储在java虚拟机栈中,通过压栈出栈的方式进行方法调用.
栈帧又可以为分为局部变量表,操作数栈,动态连接,方法出口等.
java方法中的局部基本类型变量存放在局部变量表中,引用类型则只存储对象的引用地址
3.程序计数器
程序计数器就是记录当前线程执行程序的位置,改变计数器的值来确定执行的下一条指令,每个线程都有独立的程序计数器,所以他是线程私有的.
4.常用JVM参数配置
-Xms:设置堆的初始化空间,最小空间
-Xmx:设置堆的最大空间
-Xmn:设置年轻带的大小
-XX:NewSize:设置新生代最小空间
-XX:MaxNewSize:设置新生代最大空间
-Xss:设置每个线程的堆栈大小