JVM

组成部分

方法区
所有线程共享,存放`类信息`、`常量信息`、`常量池信息`、`字符串字面量`和`数字常量`
Java 堆
Java 程序中最主要的内存工作区域,存放几乎所有的对象实例,所有线程共享
Java 栈
线程私有,Java 栈在线程被创建的时候创建;
保存着`局部变量`、`方法参数`、`Java 的方法调用`、`返回值`等
局部变量表

用于报错函数的参数局部变量

操作数栈

主要保存计算过程的中间结果,存储计算过程中的临时变量

帧数据区

保存着访问常量池的指针,同事还包含一个异常处理表

本地方法栈
程序计数器
线程私有,存放入当前执行环境指针、程序计数器、操作栈指针、计算的变量指针等

JVM参数配置

Java 堆
  1. -XX:+PrintGC 打印GC日志
    2.-XX:+PrintGCDetails 查看GC详细信息,包含各个区的情况
    3.-Xms 设置初始堆大小,如:-Xms20m设置初始堆大小为20M
  2. -Xmx 设置最大堆大小,实际工作中可以将初始堆大小和最大堆大小设置相同,以减少GC次数
  3. -Xmn 设置新生代的大小,一般将新生代大小设置为整个堆空间的1/3到1/4左右
  4. -XX:SurvivorRatio 设置 eden 区和 from 或者 to 区的比例,如 -XX:SurvivorRatio=2 表示 eden/from(to)=2
  5. -XX:NewRatio 设置新生代和老年代的比例,-XX:NewRatio=2表示老年代:新生代=2:1

JVM系列三:JVM参数设置、分析

老年代
新生对象存在于 eden 区,没有GC则不会离开 Eden 区。
每经历一次GC,则年龄加一,当对象到达一定年龄,则会自动进入老年代。
  1. -XX:MaxTenuringThreshold 可以知道新生代对象经历过多少次GC后进入老年代。
  2. 大对象(新生代 eden 区无法装入时)会直接进入老年代,-XX:PretenureSizeThreshold可以指定对象大小超过多少时,自动进入老年代。
TLAB区
虚拟机对于体积不大的对象,会优先将对象分配到TLAB区
  1. -XX:-UseTLAB 不使用TLAB,默认是使用TLAB
  2. -XX:TLABSize 设置TLAB大小
  3. -XX:TLABRefillWasteFraction 设置进入TLAB空间的单个对象大小。默认64,即如果对象不大于整个TLAB空间的1/64,则在TLAB上创建对象,否则在堆上创建对象。
  4. -XX:+PrintTLAB 查看TLAB信息
  5. -XX:ResizeTLAB 自动调整 -XX:TLABRefillWasteFraction阈值。
对象分配流程
JVM_第1张图片
对象分配流程
Java 栈
  1. -Xss 指定线程的最大栈空间,这个参数直接决定了函数可调用的最大深度
方法区

默认 -XX:MaxPermSize为64M,如果当系统类较多的时候,可以通过设置-XX:PermSize或者-XX:MaxPermSize防止内存溢出,如:-XX:MaxPermSize=128M

你可能感兴趣的:(JVM)