JVM虚拟机
一、JAVA虚拟机内存模型:
1、程序计数器:非常小的内存,用于存放下一条运行的指令;
每一个线程都必须有一个独立的程序计数器,用于记录下一条要运行的指令,是一块线程私有的内存空间,CPU时间切片
2、虚拟机栈:与线程同时创建,也是线程私有内存空间,保存方法的局部变量,部分结果,并参与方法的调用与返回
异常:StackOverflowError, OutOfMemoryError, 通过设置虚拟机栈大小-Xss2M,栈越大,函数调用次数越多,对于一个函数来说,他的参数越多,内部变量越多,函数调用次数就越少。
使用栈帧方式进行保存的,进栈与出站,栈帧结构【局部变量表、操作数栈、动态连接方法、返回地址】
3、本地方法栈:用于存放函数调用堆栈信息
4、JAVA堆(空间):所有线程共享,用于存放JAVA程序运行时所需的对象等数据(对象、数组)
被划分为新生代和老年代两部分
Eden:对象出生地,
S0,S1 Survivor经历过GC回收后的
老年代:tenured,经过多次GC回收的
5、方法区: 所有线程共享,用于存放程序的类元数据信息,类的类型信息(类名、父类名、修饰符、直接接口),常量池,域信息,方法信息。也叫永久区,是一块独立于Java堆的内存空间。也是要回收的,只是回收与堆不同。
二、JVM内存分配参数
1、设置最大堆内存:
-Xmx最大堆指的是新生代和老年代的大小之和的最大值
2、设置最小堆内存:
-Xms JVM会试图将系统内存尽可能限制在-Xms中,当内存实际使用量触及到-Xms大小时,会触发Full GC。
如果-Xms值比较大时,系统运行初期较少GC的次数和耗时。
3、设置新生代大小
-Xmn
hot Spot:-XX:NewSize新生代初始大小和-XX:MaxNewSize
设置一个较大的新生代会减少老年代大小
4、设置持久代:不属于堆的一部分
持久代的大小直接决定了系统可以支持多少个类定义和多少常量。
-XX:PermSize设置持久代的初始大小,-XX:MaxPermSize
5、堆的比例分配
-XX:SurvivorRatio设置新生代中eden空间与S0,S1比例关系
-XX:NewRatio 设置新生代和老年代的比例