《从零开始带你成为JVM实战高手》 笔记二

本文深入探讨了JVM内存管理的关键概念,包括年轻代与老年代的区别、对象的分配策略、垃圾回收机制以及如何合理设置JVM内存参数,特别针对高并发场景如支付系统的内存调优。

一、第八课 聊聊年轻代、老年代

年轻代:创建和使用完后立马就要回收的对象放在里面

老年代:需要一直存在的对象放在里面

如图所示

思考题

问题:方法区内会不会进行垃圾回收

回答:在以下几种情况下,方法区里的类会被回收

1)首先该类的所有实例对象都已经被回收

2)加载这个类的classloader已经被回收

3)对该类的class对象没有任何引用

二、第九课 对象在JVM内存中如何分配

如果一个实例对象在新生代中,成功的在15次垃圾回收之后,还没被回收掉,就会被转移到老年代中

总结

思考题

问题:Java虚拟机栈需要垃圾回收吗?

回答:不需要。JVM垃圾回收针对的是新生代、老年代、方法区(永久代),不会针对方法的栈帧。方法一旦执行完毕,栈帧出栈,里面的局部变量直接从内存里清理掉了

三、第十课 线上部署如何设置JVM内存大小

-Xms:堆内存大小

-Xmx:堆内存最大大小

-Xmn:堆内存中的新生代大小,扣除新生代剩下的就是老年代大小

-Xss:每个线程的栈内存大小 

-XX:PermSize:永久代大小(JDK8前用)

-XX:MaxPermSize:永久代最大大小(JDK8前用)

-XX:MetaspaceSize:元数据区大小(JDK8后用)

-XX:MaxMetaspaceSize:元数据区最大大小 (JDK8后用)

使用如图:

四、第十一课 每日百万交易的支付系统,如果设置JVM堆内存大小

按照以下思路分析,括号中的是举例

  • 每秒钟有多少并发量?(比如订单系统,一秒有30个订单请求)
  • 每个并发要创建多少个对象,总共占多少内存?(一个订单请求要创建20个对象,一个对象占据500Byte,那一共算10kb)
  • 每个并发需要多久才能执行完成?(一个订单从收到请求、创建对象、入库、请求完成大概需要一秒)

所以可以这样想,一秒钟会创建600个对象,总共在新生代占据600*10=6M的内存空间,(这些对象只会在新生代),那么就可以根据实际机器配置等因素,在尽可能降低mino gc频率的情况下,找出合适的新生代大小,以及对应的老年代大小

五、第十二课 每日百万交易的支付系统,如果设置JVM栈内存和永久代大小

永久代主要存放类的信息,一般设置几百MB就够用了。栈内存一般不会特别设置,默认1MB左右,就差不多够用了

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值