jvm调优应该知道的一点东西

概念

概念
Java 工具
jstat
jmap
VisualVM
调优总结
分代
年轻代:

所有新生成的对象首先都是放在年轻代的。年轻代的目标就是尽可能快速的收集掉那些生命周期短的对象。年轻代分三个区。一个Eden区,两个Survivor区(一般而言)。大部分对象在Eden区中生成。当Eden区满时,还存活的对象将被复制到Survivor区(两个中的一个),当这个Survivor区满时,此区的存活对象将被复制到另外一个Survivor区,当这个Survivor去也满了的时候,从第一个Survivor区复制过来的并且此时还存活的对象,将被复制“年老区(Tenured)”。需要注意,Survivor的两个区是对称的,没先后关系,所以同一个区中可能同时存在从Eden复制过来 对象,和从前一个Survivor复制过来的对象,而复制到年老区的只有从第一个Survivor去过来的对象。而且,Survivor区总有一个是空的。同时,根据程序需要,Survivor区是可以配置为多个的(多于两个),这样可以增加对象在年轻代中的存在时间,减少被放到年老代的可能。

老年代:

在年轻代中经历了N次垃圾回收后仍然存活的对象,就会被放到老年代中。因此,可以认为老年代中存放的都是一些生命周期较长的对象。

持久代:

用于存放静态文件,如今Java类、方法等。持久代对垃圾回收没有显著影响,但是有些应用可能动态生成或者调用一些class,例如Hibernate等,在这种时候需要设置一个比较大的持久代空间来存放这些运行过程中新增的类。持久代大小通过-XX:MaxPermSize=<N>进行设置。

何时GC
由于对象进行了分代处理,因此垃圾回收区域、时间也不一样。GC有两种类型:Scavenge GC(Monitor GC)和Full GC。

Scavenge GC

一般情况下,当新对象生成,并且在Eden申请空间失败时,就会触发Scavenge GC,对Eden区域进行GC,清除非存活对象,并且把尚且存活的对象移动到Survivor区。然后整理Survivor的两个区。这种方式的GC是对年轻代的Eden区进行,不会影响到年老代。因为大部分对象都是从Eden区开始的,同时Eden区不会分配的很大,所以Eden区的GC会频繁进行。因而,一般在这里需要使用速度快、效率高的算法,使Eden去能尽快空闲出来。

Full GC

对整个堆进行整理,包括Young、Tenured和Perm。Full GC因为需要对整个对进行回收,所以比Scavenge GC要慢,因此应该尽可能减少Full GC的次数。在对JVM调优的过程中,很大一部分工作就是对于FullGC的调节。有如下原因可能导致Full GC:

Java 工具

jstat

jstat -gcutil [pid] [internal]
监视VM内存内的各种堆和非堆的大小及其内存使用量
[pid]: java进程id
[internal]: 打印内存使用量间隔, 单位毫秒
[@hostname ~]# jstat -gcutil 22792 1000
S0 S1 E O P YGC YGCT FGC FGCT GCT
11.10 0.00 9.01 3.33 99.98 96 1.045 1 0.094 1.138
11.10 0.00 13.78 3.33 99.98 96 1.045 1 0.094 1.138
11.10 0.00 14.20 3.33 99.98 96 1.045 1 0.094 1.138
11.10 0.00 15.64 3.33 99.98 96 1.045 1 0.094 1.138
11.10 0.00 16.91 3.33 99.98 96 1.045 1 0.094 1.138
11.10 0.00 18.26 3.33 99.98 96 1.045 1 0.094 1.138
11.10 0.00 18.28 3.33 99.98 96 1.045 1 0.094 1.138
11.10 0.00 19.20 3.33 99.98 96 1.045 1 0.094 1.138
11.10 0.00 20.14 3.33 99.98 96 1.045 1 0.094 1.138
11.10 0.00 20.20 3.33 99.98 96 1.045 1 0.094 1.138
11.10 0.00 21.36 3.33 99.98 96 1.045 1 0.094 1.138
S0: Survivor space 0 区已使用空间的百分比
S1: Survivor space 1 区已使用空间的百分比
E: Eden space 区已使用空间的百分比
O: Old space 区已使用空间的百分比
P: Perm space 区已使用空间的百分比
YGC: Young GC 的次数
YGCT: Young GC 所用的时间 单位秒
FGC: Full GC 的次数
FGCT: Full GC 所用的时间 单位秒
GCT: 用于垃圾回收的总时间 单位秒
jmap

jmap -heap [pid]
查看java进程VM已分配空间及使用情况
[pid]: java进程id
[@zjm_106_154 ~]# jmap -heap 22792
Attaching to process ID 22792, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 19.0-b09

using thread-local object allocation.
Parallel GC with 8 thread(s)

Heap Configuration:
MinHeapFreeRatio = 40 # 对应jvm启动参数 -XX:MinHeapFreeRatio 设置JVM堆最小空闲比率 (默认40)
MaxHeapFreeRatio = 70 # 对应jvm启动参数 -XX:MaxHeapFreeRatio 设置JVM堆最大空闲比率 (默认70)
MaxHeapSize = 10737418240 (10240.0MB) # 对应jvm启动参数 -XX:MaxHeapSize 设置JVM堆的最大大小
NewSize = 5368709120 (5120.0MB) # 对应jvm启动参数 -XX:NewSize 设置JVM堆的年轻代的默认大小
MaxNewSize = 5368709120 (5120.0MB) # 对应jvm启动参数 -XX:MaxNewSize 设置JVM堆的年轻带的最大大小
OldSize = 5439488 (5.1875MB) # 对应jvm启动参数 -XX:OldSize 设置JVM堆的老年代的大小
NewRatio = 2 # 对应jvm启动参数 -XX:NewRatio 老年代与年轻代的大小比率
SurvivorRatio = 8 # 对应jvm启动参数 -XX:SurvivorRatio 设置年轻代中Eden区与Survivor区的大小比值
PermSize = 21757952 (20.75MB) # 对应jvm启动参数 -XX:PermSize 设置JVM堆的持久带的初始大小
MaxPermSize = 1073741824 (1024.0MB) # 对应jvm启动参数 -XX:MaxPermSize 设置JVM堆的永生代的最大大小

Heap Usage:
PS Young Generation
Eden Space: # Eden区内存分布 总量 已使用 空闲 使用比率
capacity = 5357305856 (5109.125MB)
used = 1647437208 (1571.118553161621MB)
free = 3709868648 (3538.006446838379MB)
30.751225565270396% used
From Space: # 其中一个Survivor区内存分布 总量 已使用 空闲 使用比率
capacity = 5898240 (5.625MB)
used = 2375696 (2.2656402587890625MB)
free = 3522544 (3.3593597412109375MB)
40.278049045138886% used
To Space: # 另一个Survivor区内存分布 总量 已使用 空闲 使用比率
capacity = 5505024 (5.25MB)
used = 0 (0.0MB)
free = 5505024 (5.25MB)
0.0% used
PS Old Generation # 当前老年代内存分布 总量 已使用 空闲 使用比率
capacity = 5368709120 (5120.0MB)
used = 181392168 (172.98905181884766MB)
free = 5187316952 (4947.010948181152MB)
3.3786924183368683% used
PS Perm Generation # 当前持久代内存分布 总量 已使用 空闲 使用比率
capacity = 72286208 (68.9375MB)
used = 72213176 (68.86785125732422MB)
free = 73032 (0.06964874267578125MB)
99.89896827898346% used
VisualVM

remote jvm args
无认证连接(适合测试环境)
-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9999 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false

密码认证连接(用于生产环境) 需配置连接用户和权限([jre]/lib/management/jmxremote.access & jmxremote.password文件) 参考 http://download.oracle.com/javase/1.5.0/docs/guide/management/agent.html
-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9999 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.password.file=/usr/local/jdk/jre/lib/management/jmxremote.password

远程主机上启动jstatd进程
jstatd -J-Djava.security.policy=permissions.txt
permissions.txt内容
grant {
permission java.security.AllPermission;
};
VisualVM里添加远程主机,并为其添加JMX连接和jstatd连接

[img]http://dl.iteye.com/upload/attachment/0063/8441/cc993811-5c4c-3187-9ee9-176fb8faab63.png[/img]

调优总结

尽量减少Full GC的次数, 因为Full GC的消耗要比Monitor GC要大
年轻代大小: 尽可能设大, 降低年轻代GC次数, 同时也减少达到老年代的对象
分配堆栈的最小值最好等于最大值, 因为动态分配也是需要耗费时间的. 如年轻代, 老年代, 持久代的最小最大值可设为一致
参考

http://www.oracle.com/technetwork/java/gc-tuning-5-138395.html http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html
[img]http://dl.iteye.com/upload/attachment/0063/8443/9379bc61-1d5b-3bf2-864d-531233fa250f.gif[/img]
JVM系列-参数调优1 说到JVM的参数调休,一定得知道JVM的内存结构,理解JVM内存结构的参数调优都是耍流氓,参数调优至少要知道调的是什么,优化的是什么。 JVM内存和物理机内存其实是有很多对应关系的,JVM的内存也受到物理机内存的约束,毕竟JVM内存是基于物理内存虚拟出来的东西,大体来说, JVM内存分为heap区、stack区、method区、程序计数器,再细分一点的话heap区又分为新代和老代,栈区又分为j 阅读详情

相关推荐

JVM_第七篇:双管齐下,JVM内部优化与JVM性能调优

文章目录一、前言二、编译时优化2.1 Javac编译器2.2 Java语法糖2.2.1 泛型和泛型擦除2.2.2 自动装箱、自动拆箱、遍历循环2.2.3 条件编译三、运行时优化(核心:JIT编译器/即时编译器)3.1 HotSpot虚拟机内的JIT编译器3.1.1 编译器和解释器并存的架构3.1.2 编译对象和触发条件3.1.3 不同的编译过程3.2 编译优化技术3.2.1 公共子表达式消除(局部公共子表达式消除+全局公共子表达式消除)3.2.2 数组范围检查消除3.2.3 方法内联3.2.4 逃逸分析(

毛毛的专栏 3555

实践项目中的JVM调优

背景 有个项目在接入阿里云的

YYQ_QYY的专栏 989

《统计学习方法》——李航 学习大纲

最近在学习李航写的统计学习方法概论, 每一章都用xmind理清了思路,括号里是书里的公式,第一次写博文,敬请指教~~~~ 第一章 统计学习方法论 第二章 感知机 每个方法其实只需要着重掌握三要素和输入输出就可以了,主要看模型、策略和算法。 感知机主要是二类分类的线性分类模型。 看到后面会注意感知机和支持向量机的区别。 第三章 k近

wjy619251334的博客 1万+

JVM 年轻代 老年代 持久代 GC

虚拟机中的共划分为三个代:年轻代(Young Generation)、年老点(Old Generation)和持久代(Permanent Generation)。其中持久代主要存放的是Java类的类信息,与垃圾收集要收集的Java对象关系不大。年轻代和年老代的划分是对垃圾收集影响比较大的。 年轻代: 所有新生成的对象首先都是放在年轻代的。年轻代的目标就是尽可能快速的收集掉那些生命周

夜-feng的专栏 3084

微磁模拟实战指南:从OOMMF安装到首个3D模型运行

本文详细介绍了OOMMF微磁模拟软件的安装与使用,从环境配置到首个3D模型运行的完整教程。涵盖Windows、Linux和macOS平台的安装避坑指南,以及MIF文件编写、并行计算优化等实战技巧,帮助研究人员快速掌握这一开源工具在磁畴壁运动、磁滞回线等微磁学问题中的应用。

weixin_29294597的博客 153

【AMD显卡在WIndow10/11部署带GPU支持的深度学习环境(Pytorch-DirectML篇)】

这篇是之前Tensorflow-DirectML的姊妹篇,如果对TF感兴趣的可以搜索我的博文。 首先我们丢一个官网地址,但是官网那个会误导新人如果你按那个操作的话。 https://docs.microsoft.com/en-us/windows/ai/directml/gpu-pytorch-windows 这里用我的方法操作: 首先声明一下,因为我的显卡是AMD RX6600,不带XT(性能和RTX3060 12G版本半斤八两),所以目前没有最新的WSL2驱动,如果有了的话欢迎告知我,所以我这里就.

weixin_44029053的博客 2万+

JVM调优--计算对象占用的空间

需要了解的知识 jvm参数 -javaagent 看注释 /** * * 普通对象的结构如下,按64位机器的长度计算 1. 对象头(_mark), 8个字节 2. Oop指针,如果是32G内存以下的,默认开启对象指针压缩,4个字节 3. 数据区 4.Padding(内存对齐),按照8的倍数对齐 ----所以在32G内存设备下,一个空对象默认占用8+4个字节 由于内存对其补齐8

天下无双 615

大麦网抢票软件工具开发系列(一)

前言《大麦网》都知道吧,就是那个被网友声称“大麦网你卖啥了?”票务平台。近期有听到朋友说《大麦网》的票很难抢,基本上都是说:“哎哟喂,被挤爆啦,请稍后重试!”,也不知道《大麦网》...

架构文摘 1万+

jvm 大对象持久存活,不让其进入老年区的方法

[root@ ~]# jmap -heap 20416 Attaching to process ID 20416, please wait... Debugger attached successfully. Server compiler detected. JVM version is 24.75-b04 using thread-local object allocation. Para...

lxlmycsdnfree的博客 2513

解决西门子Step 7 basic 找不到许可证问题

你在使用博图软件是否遇到过Step 7 basic 找不到许可证的问题呢!不言怕,今天我就来告诉你该如何处理吧!看步骤: 1.删除原授权的License: 打开Automation License Manager应用,然后我们可以发现仅有的License Key前面有一个时钟,说明它已经过期不可用,我们就要去寻求新的Key. 打开“我的电脑”,选择C盘,点击上方查看 点击选项–>查看 然...

让技术没有门槛 14万+

virtuoso--DFF

27-实验课-std_cell2

qq_61440044的博客 2006

jvm调优到底是要干什么

面试总问的jvm调优到底是要干什么 请注意,jvm调优,调的是稳定,并不能带给你性能的大幅提升。服务稳定的重要性就不用多说了,保证服务的稳定,gc永远会是Java程序员需要考虑的不稳定因素之一。复杂和高并发下的服务,必须保证每次gc不会出现性能下降,各种性能指标不会出现波动,gc回收规律而且干净,找到合适的jvm设置。详细了解jvm的话请看神书《深入理解java虚拟机》。说些题外话...

lelemom的博客 2万+

【系统分析师】高分论文:论面向对象设计方法及应用

本文以某市职业院校合并后的信息化系统建设项目为例,探讨了面向对象设计方法在系统开发中的应用。作为系统分析师,作者在415.6万元、6个月工期的项目中,通过遵循单一职责原则(简化构件库)、依赖倒置原则(开发公共接口)和开闭原则(构件扩展)等设计原则,成功完成了5个子系统融合改造和4个智慧实训室建设。项目采用J2EE分层设计和SOA架构,最终在2022年11月顺利上线,提升了教学管理效率,获得用户好评。文章总结了设计原则对提高系统复用性、可维护性的重要作用,同时也反思了部署过程中的经验教训。

数据知道的博客 7955

JVM原理和调优的理解和学习

JVM原理和调优的理解和学习

weixin_46460843的博客 7833

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

JVM 调优方法

参考JVM调优总结 在调优之前,我们需要记住下面的原则: 1、多数的Java应用不需要在服务器上进行GC优化; 2、多数导致GC问题的Java应用,都不是因为我们参数设置错误,而是代码问题; 3、在应用上线之前,先考虑将机器的JVM参数设置到最优(最适合); 4、减少创建对象的数量; 5、减少使用全局变量和大对象; 6、GC优化是到最后不得已才采用的手段; 7、在实际使用中,分析...

在杯子里放零食的博客 4079

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

JVM调优工具

JVM调优工具 Jconsole : jdk自带,功能简单,但是可以在系统有一定负荷的情况下使用。对垃圾回收算法有很详细的跟踪。 JProfiler:商业软件,需要付费。功能强大。 VisualVM:JDK自带,功能强大,与JProfiler类似。推荐。 如何调优 观察内存释放情况、集合类检查、对象树 上面这些调优工具都提供了强大的功能,但是总的来说一般分为以下几类功能 堆信息查...

persistence勿忘初心 6930

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

JVM 调优,到底是调什么?

内存分配合理:堆大小、新老代比例、Metaspace 上限GC 停顿可控:选对收集器,参数配合业务场景没有内存泄漏:长期运行内存稳定,OOM 原因明确线程健康:没有死锁,没有严重锁竞争JIT 充分工作:代码缓存够用,热点代码被充分编译真正好的 JVM 调优,是让你感觉不到 JVM 的存在——接口稳定、内存平稳、GC 安静。本文所有参数以 JDK 11/17 为主。不同 JDK 版本部分参数有差异,建议结合查看当前 JVM 的实际默认值。

8年+后端老兵 | Java & Go 深度实践者 | 热衷于高并发、微服务与系统架构设计 持续输出干货,记录踩坑与成长,与你一起在技术的路上走得更远。 1105

JVM调优基本步骤

本文来说下JVM调优基本步骤 文章目录概述 概述

wh柒八九的博客 3024

JVM调优

首先频繁进行fullGC(可以查看日志观察jvm的内存状态发现),程序变得很慢OOM(配置参数-xx:+heapdumpOutOfMemory),发生OOM自动dump文件,根据文件分析一下哪里发生OOM了除了上述的两种方式还可以根据阿尔萨斯或者服务器的控制台去查看jvm的具体情况,这时候再判断内存是否需要调优了。

hellowordqqqq的博客 784

为什么要学习jvm调优?

在深入探讨为什么要学习JVM调优之前,我们首先需要了解什么是JVM。JVM,全称为Java虚拟机(Java Virtual Machine),是一个抽象计算机的概念,它为Java程序提供了一个与平台无关的执行环境。这意味着为JVM编写的程序可以在任何安装了JVM的设备上运行,而无需进行任何修改。

qq_74011163的博客 1498

JVM调优和线上问题

JVM调优可能很多人都没遇到过,真正遇到了不知道如何去分析和解决问题,其实很多时候我们出现这个问题的原因都是最近提交的代码有问题,出现问题的时候主要靠cpu,内存等指标去参考,并且一般只有内存dump才能知道是什么问题。所以下面我总结了我如何排查线上JVM的问题,以及如何去调优,下一章我也会介绍一个大杀器Arthas。

qq_24768941的博客 2460

JVM内存监控及调优分析

JVM内存监控命令和工具的使用以及内存泄漏和死锁等相关问题的实战分析,JVM调优说明

qq_43418737的博客 3410

教会你如何进行JVM内存调优

JVM性能调优牵扯到各方面的取舍与平衡,往往是牵一发而动全身,需要全盘考虑各方面的影响。在优化时候,切勿凭感觉或经验主义进行调整,而是需要通过系统运行的客观数据指标,不断找到最优解。同时,在进行性能调优前,您需要理解并掌握以下的相关基础理论知识: 1、JVM垃圾收集器和垃圾回收算法 2、JVM性能监控常用工具和命令 3、JVM运行时数据区域 4、能够读懂gc日志 5、内存分配与回收策略

Java_LingFeng的博客 4509

JVM调优与问题排查

JVM 调优分类 调优是一个很大的概念,简单说就是把系统进行优化,但是站在系统的角度,我们一般把jvm条又分为三部分: 1.JVM预调优 2.调优JVM 运行环境(慢、卡顿等) 3.解决JVM中的问题(OOM、CPU飙升等) 调优中,现象最明显的是 OOM,因为有异常抛出,当然它也只是作为调优的一部分。预调优和优化运行环境估计很多人做的就是服务器重启而已。前一篇文章调优就是JVM内存结构调优的一种方式。 JVM 预调优 业务场景设定 调优是要分场景的,所以一定要明显你调优项目的场景设定,像现在大家都是微服务

bug_come的博客 1919
上一篇: select、poll、epoll的比较
下一篇: epoll的两种模式
linux内核控
博客等级 码龄19年 41粉丝 638原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值