JVM内存调优

JVM源码编译过程

分析和输入到符号表
注解处理
语句分析和生成class文件

class文件组成部分

结构信息:文件格式版本号和数量、大小信息
元数据:声明与常量的信息,包含类/继承的超类/实现接口的声明信息、域与方法声明信息和常量池
方法信息:语句与表达式对应的信息,包含字节码、异常处理器、求值栈和局部变量区大小、求值栈的类型记录、调试符号信息

JVM内存结构

年轻代

新建对象为年轻代分配内存,eden区内存不足时,执行minor GC ,把存活对象往suivivor区移动,年轻代大小由-Xmn来控制,整个堆内存总量是一定的,一般情况下年轻代占总内存的1/3或者1/4,eden区又占新生代的8/10,剩余的两个suivivor各占1/10.

年老代

存放年轻代多次GC回收仍然存活的对象

持久代

存放已加载类信息、方法信息、常量池等

参数配置

-Xmx:最大堆内存,如:-Xmx512m
-Xms:初始时堆内存,如:-Xms256m
-XX:MaxNewSize:最大年轻区内存
-XX:NewSize:初始时年轻区内存.通常为 Xmx 的 1/3 或 1/4。新生代 = Eden + 2 个 Survivor 空间。实际可用空间为 = Eden + 1 个 Survivor,即 90%
-XX:MaxPermSize:最大持久带内存
-XX:PermSize:初始时持久带内存
-XX:+PrintGCDetails。打印 GC 信息
-XX:NewRatio 新生代与老年代的比例,如 –XX:NewRatio=2,则新生代占整个堆空间的1/3,老年代占2/3
-XX:SurvivorRatio 新生代中 Eden 与 Survivor 的比值。默认值为 8。即 Eden 占新生代空间的 8/10,另外两个 Survivor 各占 1/10

每个线程执行一个方法都会为这个方法在栈中申请一个栈帧,其中包括局部变量和操作数栈,用于存放此次调用过程中的临时变量、参数和中间结果。-Xss设置每个线程堆栈大小,推荐为1m。

方法区

存放要加载的类信息、静态变量、final类型的常量、属性和方法信息

垃圾回收器

串行GC

单线程模式,适合单CPU,年轻代空间较小,对暂停时间要求不是非常高的应用,是client级别默认GC方式

并行GC

多线程模式,适合多CPC以及对暂停时间要求较短的应用,是server级别默认GC方式

并发GC

与老年代并行GC配合使用

内存调优

调优的目的其实就是为了减少GC的频率和Full gc的次数,过多的GC和Full gc会占用过多的系统资源,影响系统吞吐量,而且Full gc每次是对整个堆进行整理。

调优方法

1.调优时尽量让对象在年轻代GC时被回收,让对象在年轻代多存活一段时间,不要创建过大的对象及数组,避免大对象直接跑到老年代,引起老年代空间不足,触发Full gc对整个堆空间进行回收整理
2.垃圾不要主动触发,尽量依靠JVM自有机制
3.如果年轻代设置过小,GC次数频繁,增加系统消耗
4.如果年轻代设置过大,老年代就会过小,诱发Full gc
5.如果suivivor区设置过大,eden区过小,增加GC频率
6.如果suivivor区设置过小,导致对象直接从eden区跑到老年代,降低了在年轻代存活的时间

GC策略设置方式

吞吐量优先:以吞吐量为指标,自行选择相应的GC策略以及控制年轻代和年老代大小比例,达到吞吐量指标,通过-XX:GCTimeRatio=n来设置
暂停时间优先:以暂停时间为指标,自行选择相应的GC策略以及控制年轻代和年老代的大小比例,尽量保证每次GC造成的应用停止时间都在指定数值范围内完成,通过XX:MaxGCPauseRatio=n来设置

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值