性能测试关注点之JVM、GC相关

(本文为初识性能测试的小白在参与性能项目的时候的一些笔记和知识点梳理)

一、前提

在参与性能项目过程中,在脚本执行过程中,监控到交易TPS波动明显并持续下降,FullGC频繁,通过减少并发数量和减少持续时间等排除一些原因,确定为JVM性能问题,大概率是垃圾回收内存分配或垃圾回收机制问题。(最后调优办法为增大matespace内存和改变垃圾回收机制为异步)

作为性能测试人员,JVM和其中的一些知识还是需要了解的,本文是一些学习笔记并会附上一些大佬的资料作为收藏学习。

二、有关JVM(Java Virtual Machine)

虚拟机是一种抽象化的计算机,通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机有自己完善的硬体架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。Java虚拟机屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。简单来说JVM是用来解析和运行Java程序的。

(图源JVM详解——什么是JVM、JVM优点_奋斗中的编程菜鸟的博客-CSDN博客_jvm是什么

上图主要是整体JVM的物理结构,知识要慢慢学,这次笔记主要写内存空间和GC。

堆内存用途:存放的是对象,垃圾收集器就是收集这些对象,然后根据GC算法回收。

非堆内存用途:永久代,也称为方法区,存储程序运行时长期存活的对象,比如类的元数据、方法、常量、属性等。

在JDK1.8版本废弃了永久代,替代的是元空间(MetaSpace),元空间与永久代上类似,都是方法区的实现,他们最大区别是:元空间并不在JVM中,而是使用本地内存。

元空间有注意有两个参数:

MetaspaceSize :初始化元空间大小,控制发生GC阈值

MaxMetaspaceSize : 限制元空间大小上限,防止异常占用过多物理内存

三、GC(Gabage Collection)

java堆(GC堆),非堆(永久代)存在于JVM的线程共享的数据区

程序在运行过程中,会产生大量的内存垃圾(一些没有引用指向的内存对象都属于内存垃圾,因为这些对象已经无法访问,程序用不了它们了,对程序而言它们已经死亡),为了确保程序运行时的性能,java虚拟机在程序运行的过程中不断地进行自动的垃圾回收。

手动GC,System.gc();

Java的垃圾回收机制是Java虚拟机提供的能力,用于在空闲时间以不定时的方式动态回收无任何引用的对象占据的内存空间。也就是说,垃圾收集器回收的是无任何引用的对象占据的内存空间而不是对象本身。

GC算法:根据各个年代的特点采取最适当的收集算法:

在新生代中,每次垃圾收集时候都发现有大批对象死去,只有少量存活,那就选用复制算法。只需要付出少量存活对象的复制成本就可以完成收集;

老年代中因为对象存活率高、没有额外空间对他进行分配担保,就必须用标记-清除或者标记-整理;

垃圾回收方式:并行:Parallel指多条垃圾收集线程并行工作,此时用户线程处于等待状态;

并发:Concurrent指用户线程和垃圾回收线程同时执行(不一定是并行,有可能是交叉执行),用户进程在运行,而垃圾回收线程在另一个 CPU 上运行。

GC触发条件:

Minor GC 触发条件一般为:

1、eden区满时,触发MinorGC。即申请一个对象时,发现eden区不够用,则触发一次MinorGC。

2、新创建的对象大小 > Eden所剩空间;

Major GC和Full GC 触发条件一般为:(Major GC通常是跟full GC是等价的)

1、每次晋升到老年代的对象平均大小>老年代剩余空间;

2、MinorGC后存活的对象超过了老年代剩余空间;

3、永久代空间不足;

4、执行System.gc();

5、CMS GC异常;

6、堆内存分配很大的对象;

四、调优

JVM三大性能调优参数:-Xms –Xmx –Xss

-Xms –Xmx是对堆的性能调优参数,-Xms:表示初始化JAVA堆的大小及该进程刚创建出来的时候,他的专属JAVA堆的大小,一旦对象容量超过了JAVA堆的初始容量,JAVA堆将会自动扩容到-Xmx大小。

-Xmx:表示java堆可以扩展到的最大值,在很多情况下,通常将-Xms和-Xmx设置成一样的,因为当堆不够用而发生扩容时,会发生内存抖动影响程序运行时的稳定性。

-Xss是对每一个线程栈的性能调优参数,-Xss:规定了每个线程虚拟机栈及堆栈的大小,一般情况下,256k是足够的,此配置将会影响此进程中并发线程数的大小。

参考:

JVM架构和GC垃圾回收机制(JVM面试不用愁)_aijiudu的博客-CSDN博客_jvm垃圾回收

深入聊聊Java 垃圾回收机制【附原理图及调优方法】_不埋雷的探长的博客-CSDN博客

图解Java 垃圾回收机制_书呆子Rico的博客-CSDN博客_java垃圾回收机制

 

 

 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值