JVM调优实战

垃圾回收核心思想

公理:当一个对象不再被引用时则可以被回收。

判断一个对象是否被引用的算法:1、引用计数法;2、可达性分析;

引用计数法无法解决循环引用问题,所以目前主流垃圾回收器不采用。
可达性分析需要先找到gc roots ,一般存在栈和方法区中。

JDK1.2之后,对引用的概念进行了扩充:强软弱虚
强引用永远不被回收,软引用在内存溢出时被回收,弱引用是在发生垃圾回收时都会被回收,虚引用是在被回收时发出一个通知。

垃圾收集算法分类(从低级到高级):
标记-清除算法(容易产生内存碎片)
复制算法(无碎片,但内存只能用一半)
标记-整理算法(解决了内存空间利用率问题,但用时长,效率差)
分代回收算法(综合了以上几种算法的优点,是一套组合拳,为目前主流)

JVM调优案例

亿级流量电商网站,在大促时,每秒产生1000笔订单,假设服务器有三台,每台需处理每秒300笔订单。根据经验,一个POJO对象不会超过1kb,300个订单对象就是300kb,考虑到相关联的其他对象,例如积分、用户、库存、优惠券等等,放大20倍,为6mb对象数据,可能还有其他操作,例如订单查询等,再放大10倍,为60mb对象数据,这些对象的存活时间假设都为1秒钟。

启动JVM时设置堆内存3个G,其中老年代2G,年轻代1G,年轻代又分为伊甸园区800mb,S0和S1各100mb。

出现的问题是:每隔几分钟就出现一次FullGC,造成STW(Stop The World),系统卡顿。

分析:

每秒产生的60mb对象数据大约14秒占满伊甸园区,进行一次MinorGC,会有60mb对象存活,此时JVM按动态年龄判断规则会进行一次判断,如果这些数据没有超过S0空间的一半,则进入S0区,如果超过,直接进入老年代。

事实上是超过了S0区的一半,所以直接进入了老年代。也就是说每隔14秒都有一批对象进入了老年代。而进入老年代之后的下一秒,就成为垃圾了。过一些时间,老年代满了就会触发FullGC,造成卡顿。

解决方法是:把年轻代的空间调大一些。

启动命令:
java -Xms3072M -Xmx3072M -Xmn2048M -Xss1M -XX:MetaspaceSize=512M -XX:MaxMetaspaceSize=512M -jar liandong-server.jar

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一、什么是JVM  JVMJava Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域。 JVM屏蔽了与具体操作系统平台相关的信息,使Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。JVM在执行字节码时,实际上最终还是把字节码解释成具体平台上的机器指令执行。  Java语言的一个非常重要的特点就是与平台的无关性。而使用Java虚拟机是实现这一特点的关键。一般的高级语言如果要在不同的平台上运行,至少需要编译成不同的目标代码。而引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。Java虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。这就是Java的能够“一次编译,到处运行”的原因。二、JVM的组成我们先把JVM这个虚拟机画出来,如下图所示:从这张图中我们可以看出,JVM是运行在操作系统之上的,它与硬件没有直接的交互,我们再来看JVM由哪些部分组成,如下图所示:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值