热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

JVM性能调优实现原理及配置

这篇文章主要介绍了JVM性能调优实现原理及配置,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

1、JVM内存模型

总结:可以发现最明显的一个变化是元空间从虚拟机转移到了本地内存。默认情况下,元数据空间大小仅受限于本地内存, 这意味着以后不会因为永久代大小不够而抛出OOM异常了。 jdk1.8以前,HotSpot VM将class和类的jar包数据存储在PermGen里, PermGen大小是固定的,而且项目之间无法公用公有的class,所以很容易碰到OOM异常。改成MateSpace后, 各个项目会共享同样的class空间。比如多个项目都引用了apache-common包, 在MateSpace中只会存储一份的apache-common的class,提高了内存的利用率,垃圾回收更有效。

2、JVM堆内存常用参数

参数 描述
-Xms 堆内存初始大小,单位m、g
-Xmx(MaxHeapSize) 堆内存最大允许大小,一般不要大于物理内存的80%
-XX:PermSize 非堆内存初始大小,一般应用设置初始化200m,最大1024m就够了
-XX:MaxPermSize 非堆内存最大允许大小
-XX:NewSize(-Xns) 年轻代内存初始大小
-XX:MaxNewSize(-Xmn) 年轻代内存最大允许大小,也可以缩写
-XX:SurvivorRatio=8 年轻代中Eden区与Survivor区的容量比例值,默认为8,即8:1
-Xss 堆栈内存大小

3、GC(Garbage Collection)算法

这里的GC具体指的是新生代的复制算法

首先贴一张网上盗来的大图,用它来说明一下GC的过程


内存分配策略:

大多数情况下,对象在新生代的Eden中分配。当Eden区没有足够的空间进行分配时,虚拟机将发起一次Minor GC,而大对象(需要大量连续内存空间的Java对象,类似长字符串和数组)将通过分配担保机制直接进入老年代。

Minor GC——复制算法具体过程:

将Eden和S0中还存活着的对象一次性的复制到S1中,并且清理掉Eden与S0的空间。如果S1放不下还存活着的对象,那这些对象将通过分配担保机制进入老年代。【原理上随时保持S0和S1有一个是空的,用来存下一次的对象】

Eden区快满的时候,会进行上一步类似操作,将Eden和S1区的年纪大的对象放到S0区【此时S1区就是空的】
直到Eden区快满,S0或者S1也快满的时候,这时候就把这两个区的年纪大的对象放到Old区。

依次循环,直到Old区也快满的时候,Eden区也快满的时候,会对整个这一块内存区域进行一次大清洗(FullGC),腾出内存,为之后的对象创建,程序运行腾地方。

新生代GC(Minor GC):指发生在新生代的垃圾回收动作,因为java对象大多具备朝生夕灭的特征,所以Minor GC发生的特别频繁,

一般回收速度也很快。

老年代GC(Major GC/Full GC):指发生在老年代的GC,出现了Major GC,至少会伴随一次的MinorGC(但非绝对,
在Parallel Scavenge收集器的收集策略里就有直接进行Minor GC的策略选择过程)。Major GC的速度一般比Minor GC慢10倍以上。

4、JVM参数配置

在jdk1.8以前,生产环境一般有如下配置

-XX:PermSize=512M -XX:MaxPermSize=1024M

表示在JVM里存储Java类信息,常量池和静态变量的永久代区域初始大小为512M,最大为1024M。在项目启动后,这个值是固定的,如果项目class过多,很可能遇到OutOfMemoryError: PermGen异常。

升级JDK1.8之后,上面的perm配置已经变成

-XX:MetaspaceSize=512M XX:MaxMetaspaceSize=1024M

MetaspaceSize如果不做配置,通过jinfo查看默认MetaspaceSize大小(约21M),MaxMetaspaceSize很大很大,前面说过MetaSpace只受本地内存大小限制。

jinfo -flag MetaspaceSize 1234 #结果为:-XX:MetaspaceSize=21807104
jinfo -flag MaxMetaspaceSize 1234 #结果为:-XX:MaxMetaspaceSize=18446744073709547520

干货:MetaspaceSize为触发FullGC的阈值,默认约为21M,如做了配置,最小阈值为自定义配置大小。空间使用达到阈值,触发FullGC,同时对该值扩大。当然如果元空间实际使用小于阈值,在GC的时候也会对该值缩小。
MaxMetaspaceSize为元空间的最大值,如果设置太小,可能会导致频繁FullGC,甚至OOM。

5. JVM参数配置指南

前面三个部分对JVM进行了整体的了解,接下来是本文的重点。

-XX:MetaspaceSize=128M -XX:MaxMetaspaceSize=256M -Xms256m -Xmx256m

文章看下来上面这段配置的意思很简单,设置元空间的初始值和最大值,设置堆空间的初始值和最大值。

为什么MetaspaceSize要设置为128M?为什么堆内存初始值Xms设置为256M而不是512M?

按照Java官方的指导

  • Java堆大小设置,Xms 和 Xmx设置为老年代存活对象的3-4倍,即FullGC之后的老年代内存占用的3-4倍
  • MaxPermSize(元空间)设置为老年代存活对象的1.2-1.5倍。
  • 年轻代Xmn的设置为老年代存活对象的1-1.5倍。
  • 老年代的内存大小设置为老年代存活对象的2-3倍。

5. JVM监控jstat

可以让系统运行一段时间后查看系统的各个指标,然后在进行配置。如下用jstat工具查看jvm的情况

jstat -gc 12345
###
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
13824.0 22528.0 13377.0 0.0 548864.0 535257.2 113152.0 46189.3 73984.0 71119.8 9728.0 9196.2 14 0.259 3 0.287 0.546

OU表示老年代所占用的内存为 46189.3 K(大约45M);那么jvm相应的配置参数应该做如下修改

-XX:MetaspaceSize=64M -XX:MaxMetaspaceSize=64M -Xms180m -Xmx180m

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • 本文详细介绍了跨站脚本攻击(XSS)的基本概念、工作原理,并通过实际案例演示如何构建XSS漏洞的测试环境,以及探讨了XSS攻击的不同形式和防御策略。 ... [详细]
  • Maven + Spring + MyBatis + MySQL 环境搭建与实例解析
    本文详细介绍如何使用MySQL数据库进行环境搭建,包括创建数据库表并插入示例数据。随后,逐步指导如何配置Maven项目,整合Spring框架与MyBatis,实现高效的数据访问。 ... [详细]
  • 本文介绍了 PHP 的基本概念、服务器与客户端的工作原理,以及 PHP 如何与数据库交互。同时,还涵盖了常见的数据库操作和安全性问题。 ... [详细]
  • 本文介绍了如何利用Apache POI库高效读取Excel文件中的数据。通过实际测试,除了分数被转换为小数存储外,其他数据均能正确读取。若在使用过程中发现任何问题,请及时留言反馈,以便我们进行更新和改进。 ... [详细]
  • JVM参数设置与命令行工具详解
    JVM参数配置与命令行工具的深入解析旨在优化系统性能,通过合理设置JVM参数,确保在高吞吐量的前提下,有效减少垃圾回收(GC)的频率,进而降低系统停顿时间,提升服务的稳定性和响应速度。此外,本文还将详细介绍常用的JVM命令行工具,帮助开发者更好地监控和调优JVM运行状态。 ... [详细]
  • 深入解析Java内存架构、垃圾回收机制与内存泄漏问题
    Java内存架构(Java内存模型)上面是堆的Java内存模型以及Java虚拟机(JVM)中运行的任何Java应用程序的Pe ... [详细]
  • 腾讯云前台面经(笔试+3技术面+HR面)
    话不多说,直接上题。(时间周期太长,可能不太全了)面试周期:从投递简历到收到offer大概经历了一个月左右,所以最好还是不要裸辞,不然心态会裂开。笔试题:(二面、三面后的笔试)1、 ... [详细]
  • 本文通过一个经典问题——使用最少的老鼠在限定时间内找出含有毒药的瓶子,深入探讨了二分法的应用及其背后的逻辑原理。不仅展示了二分法在非传统排序问题中的有效应用,还扩展讨论了三分法的可能性与限制。 ... [详细]
  • 时序数据是指按时间顺序排列的数据集。通过时间轴上的数据点连接,可以构建多维度报表,揭示数据的趋势、规律及异常情况。 ... [详细]
  • 本文详细探讨了 HAProxy 的基本概念及其与 LVS(Linux Virtual Server)的比较,特别是在内核空间与用户空间的工作差异。文章还深入介绍了 HAProxy 独有的数据结构——弹性二叉树,以及其在高并发场景下的表现。 ... [详细]
  • 有向无环图(DAG)的两种拓扑排序方法详解
    本文介绍了有向无环图(DAG)的两种拓扑排序方法。第一种方法通过不断移除没有前驱的顶点来实现排序;第二种方法则利用深度优先搜索(DFS),记录每个节点的首次和最后访问时间,最终根据这些时间的逆序得到拓扑排序结果。 ... [详细]
  • [编程题] LeetCode上的Dynamic Programming(动态规划)类型的题目
    继上次把backTracking的题目做了一下之后:backTracking,我把LeetCode的动态规划的题目又做了一下,还有几道比较难的Medium的题和Hard的题没做出来,后面会继续 ... [详细]
  • 深入浅出:Hadoop架构详解
    Hadoop作为大数据处理的核心技术,包含了一系列组件如HDFS(分布式文件系统)、YARN(资源管理框架)和MapReduce(并行计算模型)。本文将通过实例解析Hadoop的工作原理及其优势。 ... [详细]
  • 6个常见的 PHP 安全性攻击实例和阻止方法_php实例
    这篇文章主要介绍了6个常见的PHP安全性攻击实例和阻止方法,有对这方面感兴趣的小伙伴 ... [详细]
  • 一般的网页我的项目能够很容易的实现换肤性能,能够通过js扭转link元素中引入的css主题款式链接。然而微信小程序不能动静扭转wxss文件,所以须要其余的计划来实现。 ... [详细]
author-avatar
莫念暧昧_zTq
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有