作者:别被风景迷了眼 | 来源:互联网 | 2023-09-12 13:54
1、java虚拟机内存模型主要分为:程序计数器,java虚拟机栈,本地方法栈,java堆,方法区1.1程序计数器(ProgramCounterRegister):一块较小的内存空间
1、java虚拟机内存模型
主要分为:程序计数器,java虚拟机栈,本地方法栈,java堆,方法区
1.1 程序计数器(ProgramCounter Register):
一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码的行号指示器
如果线程正在执行的是一个Java 方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;
如果正在执行的是natvie方法,这个计数器值则为空(undefined)。
此内存区域是唯一一个在Java虚拟机规范中没有规定任何OutOfMemoryError 情况的区域
1.2 JAVA虚拟机栈(java virtual machine stacks):
每个方法被执行的时候都会同时创建一个栈帧(Stack Frame)用于存储局部变量表、操作栈、动态链接、方法出口等信息
java虚拟机栈的局部变量表存放了编译期可知的各种基本数据类型、对象应用和returnAddress类型
如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常
如果虚拟机栈可以动态扩展,当扩展时无法申请到足够的内存时会抛出OutOfMemoryError异常
可以通过-Xss设置栈的大小,其大小决定了函数可调用的深度,值越大,线程数越小
1.3 本地方法栈(native method stacks):
为虚拟机使用到的Native 方法服务
1.4 java堆(java heap):
主要用来存放对象和数组实例的地方,垃圾回收的主要区域,分为新生代和老年代
新生代:
程序刚创建的对象都是从新生代分配内存,新生代
新生代又可细分为:Eden space区和两块大小相同的幸存区survivor(s0和s1或者from和头)
可以通过-Xmn指定eden区的大小,通过-XX:SurvirorRation来调整幸存区的大小
老年代:
存放多次gc后仍然存活的对象
新建的对象之间进入老年代的情况:
①.大对象,可通过启动参数设置-XX:PretenureSizeThreshold=1024(单位为字节,默认为0)来代表超过多大时就不在新生代分配,而是直接在老年代分配。
②.大的数组对象,切数组中无引用外部对象。
通过-Xmx设置最大堆内存(新生代和老年代之和),-Xms设置最小堆内存(启动jvm时占用的系统内存的大小),通常将-Xmx和-Xms设置为一样的大小来减少gc的次数
1.5 方法区
各个线程共享的内存区域,主要用来存储类的元数据、常量、静态变量、即时编译器编译后的代码等数据
通过-XX:MaxPermSize设置方法区的最大值,-XX:PermSize设置方法区的初始化大小
2、常见的四种垃圾收集器(-XX:+UseParallelGC默认方式)
2.1 新生代并行收集器(-XX:+UseParNewGC)
暂停所有应用线程,启动多个线程进行垃圾回收
2.2 新生代和老年代都用的并行回收器(-XX:+UseParallelOldGC)
暂停所有应用线程,启动多个线程进行垃圾回收
2.3 新生代和老年代都用的串行回收器(-XX:+UseSerialGC)
暂停所有应用线程,启动一个线程进行垃圾回收
2.4 CMS回收器(-XX:+UseConcMarkSweepGC)
使用多个线程来扫描堆内存来标记需要回收的实例,然后再清除被标记的实例
3、调优方法
3.1 新对象预留新生代
由于fullGC(老年代)的成本远比minorGC(新生代和老年代)的成本大,所以给应用分配一个合理的新生代空间,尽量将对象分配到新生代减小fullGC的频率
3.2 大对象进入老年代
将大对象直接分配到老年代,保持新生代对象的结构的完整性,以提高GC效率, 可以通过-XX:PretenureSizeThreshold设置进入老年代的阀值
3.3 稳定与震荡的堆大小
稳定的对大小是对垃圾回收有利的,方法将-Xms和-Xmx的大小一致
3.4 吞吐量优先
尽可能减少系统执行垃圾回收的总时间,故采用并行垃圾回收器
-XX:+UseParallelGC或使用-XX:+UseParallelOldGC
3.5 降低停顿
使用CMS回收器,同时减少fullGC的次数
4、获取gc信息的方法
4.1 -verbose:gc或者-XX:+PrintGC 获取gc信息
4.2 -XX:+PrintGCDetails 获取更加详细的gc信息
4.3 -XX:+PrintGCTimeStamps 获取GC的频率和间隔
4.4 -XX:+PrintHeapAtGC 获取堆的使用情况
4.5 -Xloggc:D:\gc.log 指定日志情况的保存路径