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 设置新生代和老年代的比例

posted @ 2019-01-16 23:05  理舞  阅读(148)  评论(0编辑  收藏  举报