组成部分
方法区
所有线程共享,存放`类信息`、`常量信息`、`常量池信息`、`字符串字面量`和`数字常量`
Java 堆
Java 程序中最主要的内存工作区域,存放几乎所有的对象实例,所有线程共享
Java 栈
线程私有,Java 栈在线程被创建的时候创建;
保存着`局部变量`、`方法参数`、`Java 的方法调用`、`返回值`等
局部变量表
用于报错函数的参数
与局部变量
操作数栈
主要保存计算过程的中间结果,存储计算过程中的临时变量
帧数据区
保存着访问常量池的指针,同事还包含一个异常处理表
本地方法栈
程序计数器
线程私有,存放入当前执行环境指针、程序计数器、操作栈指针、计算的变量指针等
JVM参数配置
Java 堆
-
-XX:+PrintGC
打印GC日志
2.-XX:+PrintGCDetails
查看GC详细信息,包含各个区的情况
3.-Xms
设置初始堆大小,如:-Xms20m设置初始堆大小为20M -
-Xmx
设置最大堆大小,实际工作中可以将初始堆大小和最大堆大小设置相同,以减少GC次数 -
-Xmn
设置新生代的大小,一般将新生代大小设置为整个堆空间的1/3到1/4左右 -
-XX:SurvivorRatio
设置 eden 区和 from 或者 to 区的比例,如 -XX:SurvivorRatio=2 表示 eden/from(to)=2 -
-XX:NewRatio
设置新生代和老年代的比例,-XX:NewRatio=2表示老年代:新生代=2:1
老年代
新生对象存在于 eden 区,没有GC则不会离开 Eden 区。
每经历一次GC,则年龄加一,当对象到达一定年龄,则会自动进入老年代。
-
-XX:MaxTenuringThreshold
可以知道新生代对象经历过多少次GC后进入老年代。 - 大对象(新生代 eden 区无法装入时)会直接进入老年代,
-XX:PretenureSizeThreshold
可以指定对象大小超过多少时,自动进入老年代。
TLAB区
虚拟机对于体积不大的对象,会优先将对象分配到TLAB区
-
-XX:-UseTLAB
不使用TLAB,默认是使用TLAB -
-XX:TLABSize
设置TLAB大小 -
-XX:TLABRefillWasteFraction
设置进入TLAB空间的单个对象大小。默认64,即如果对象不大于整个TLAB空间的1/64,则在TLAB上创建对象,否则在堆上创建对象。 -
-XX:+PrintTLAB
查看TLAB信息 -
-XX:ResizeTLAB
自动调整-XX:TLABRefillWasteFraction
阈值。
对象分配流程
Java 栈
-
-Xss
指定线程的最大栈空间,这个参数直接决定了函数可调用的最大深度
方法区
默认 -XX:MaxPermSize为64M,如果当系统类较多的时候,可以通过设置-XX:PermSize
或者-XX:MaxPermSize
防止内存溢出,如:-XX:MaxPermSize=128M