一、操作文档类功能,大量大对象直接进入老年代

问题现象

  • 操作文档类功能,大量大对象直接进入老年代,没有在Minor GC时被清理,导致老年代迅速消耗殆尽频繁进行Full GC,在服务器内存较大的情况下,Full GC会造成长时间停顿。

解决方法

通过单一Java虚拟机管理大量的内存

  • 控制Full GC 频率,完善代码逻辑,尽量使对象都满足朝生夕灭的原则,维持老年代的稳定;
  • 使用增量回收模式的垃圾收集器,例如G1;
  • 由于指针膨胀和数据类型对齐补白导致相同程序,在64位虚拟机中消耗的内存大于32位虚拟机中消耗的内存,可以开启压缩指针功能。

同一台服务器上部署若干Java虚拟机

使用逻辑集群来使用硬件资源,同一个程序在同一台服务器上使用不同端口号启动多个进程,然后搭建一个负载均衡服务器,以反向代理的方式来分配访问请求(不考虑高可用性需求,使用无Session复制的亲和式集群,均衡器固定将一个用户请求固定分配到一个固定的集群节点);

可能产生的问题:

  • 磁盘资源竞争导致I/O异常;
  • 很难高效利用资源;
  • 大量使用本地缓存的应用会造成较大的内存浪费(把本地缓存改为集中式缓存);

二、异步请求大量累积

异步请求大量累积,当请求异常时,接口超时导致双方服务速度不对等,最终累积了大量未完成的web请求超出了虚拟机承受能力,导致崩溃。

解决:

  • 修复超时接口
  • 异步web请求改为消息队列。

三、排查问题

老实说,JVM调优是一个非常庞大问题集;着手点因为实际问题的差异也各不相同;

排查问题:

  1. jmap jstat 等指令查看堆使用情况,渐次定位问题;
  2. jvisualvm 查看Java堆各个区域回收情况,查看JVM启动参数是否合理;
  3. 生成 GC 日志查看GC类型,统计各种类型的GC次数,记录GC耗时,关注异常GC;(可以使用GC日志分析工具,也可以自己用文本文档分析);
  4. 生成堆快照并分析,查看堆内是否有某些对象数量是否异常;

可能出现的问题以及原因

  1. Full GC频繁:老年代空间较小,收集速度滞后于新生代

设置老年代:新生代比例 3:1 (通常3:1为较好的选择),G1 收集器不建议使用会破坏G1的停顿预测模型。

	-XX:NewRatio=3

拓展堆内存大小,最大最小设置相同,避免运行过程中堆内存浮动

	-Xms4192m
-Xmx4192m
  1. Full GC 时间过长,这是本文讨论的第一个问题

    • 使用增量垃圾回收:G1 / (CMS + ParaNew)

        //G1 不区分新生代老年代
      -XX:+UseG1GC // 或者,CMS(老年代) + ParaNew(新生代)
      -XX:+UseParNewGC
      -XX:+UseConcMarkSweepGC

问题太多,JVM优化也只是往更优的方案靠近,没有万能的优化,只有针对具体问题的具体优化,如果后续碰到问题我会持续更新到这里。

《深入理解Java虚拟机》(六) 调优策略 -- 笔记的更多相关文章

  1. 深入理解Java虚拟机---学习感悟以及笔记

    一.为什么要学习Java虚拟机?       这里我们使用举例来说明为什么要学习Java虚拟机,其实这个问题就和为什么要学习数据结构和算法是一个道理,工欲善其事,必先利其器.曾经的我经常害怕处理内存溢 ...

  2. 《深入理解Java虚拟机》调优案例分析与实战

    上节学习回顾 在上一节当中,主要学习了Sun JDK的一些命令行和可视化性能监控工具的具体使用,但性能分析的重点还是在解决问题的思路上面,没有好的思路,再好的工具也无补于事. 本节学习重点 在书本上本 ...

  3. 深入理解Java虚拟机(六)——JVM调优分析与实战

    大内存硬件上的程序部署策略 单个虚拟机管理大内存 出现问题 如果JVM中的堆内存太小,就会频繁地出发GC,而每次GC会将用户线程暂停,所以,频繁地GC会导致长时间的停顿.如果扩大计算的内存的大小,就能 ...

  4. 读书笔记-《深入理解Java虚拟机:JVM高级特性与最佳实践》

    目录 概述 第一章: 走进Java 第二章: Java内存区域与内存溢出异常 第三章: 垃圾收集器与内存分配策略 第四章: 虚拟机性能监控与故障处理 第五章: 调优案例分析与实战 第六章: 类文件结构 ...

  5. 《深入理解java虚拟机》笔记

    二.java内存区域与内存溢出异常 0.在内存管理领域,java与c/c++不同的是,在java虚拟机自动内存管理机制下,java不需要手动去为对象写配对的free内存的代码,不容易出现内存泄漏和内存 ...

  6. 《深入理解java虚拟机》学习笔记之虚拟机即时编译详解

    郑重声明:本片博客是学习<深入理解java虚拟机>一书所记录的笔记,内容基本为书中知识. Java程序最初是通过解释器(Interpreter)进行解释执行的,当虚拟机发现某个方法或代码块 ...

  7. 《深入理解Java虚拟机》学习笔记

    <深入理解Java虚拟机>学习笔记 一.走近Java JDK(Java Development Kit):包含Java程序设计语言,Java虚拟机,JavaAPI,是用于支持 Java 程 ...

  8. 《深入理解 Java 虚拟机》笔记整理

    正文 一.Java 内存区域与内存溢出异常 1.运行时数据区域 程序计数器:当前线程所执行的字节码的行号指示器.线程私有. Java 虚拟机栈:Java 方法执行的内存模型.线程私有. 本地方法栈:N ...

  9. 深入理解Java虚拟机第三版,总结笔记【随时更新】

    最近一直在看<深入理解Java虚拟机>第三版,无意中发现了第三版是最近才发行的,听说讲解的JDK版本升级,新增了近50%的内容. 这种神书,看懂了,看进去了,真的看的很快,并没有想象中的晦 ...

  10. JVM | 第1部分:自动内存管理与性能调优《深入理解 Java 虚拟机》

    目录 前言 1. 自动内存管理 1.1 JVM运行时数据区 1.2 Java 内存结构 1.3 HotSpot 虚拟机创建对象 1.4 HotSpot 虚拟机的对象内存布局 1.5 访问对象 2. 垃 ...

随机推荐

  1. [转帖]RAC AWR重要指标说明

    1.Global Cache Load Profile Global Cache blocks received:  接收到的全局缓冲块 Global Cache blocks served: 发送的 ...

  2. [转帖]nginx 反向代理中proxy_set_header的含义

    https://www.jianshu.com/p/cd813d68ed25 0.1212020.10.23 09:29:53字数 284阅读 9,939 1.proxy_set_header设置的请 ...

  3. [转帖]高性能异步io机制:io_uring

    文章目录 1.性能测试 1.1.FIO 1.2.rust_echo_benc 2.io_uring 2.1.io_uring_setup 2.2.io_uring_enter 2.3.io_uring ...

  4. [转帖]Python安装模块(包/库)的方法

    这里写目录标题 通过pip安装 正常在线安装 pip命令补全 更改下载镜像 离线包安装 库的下载 库的安装 whl的安装 .tar.gz的安装 源码安装 本地安装报错(依赖) Pycharm中安装 手 ...

  5. [转帖]浅谈Redis大Key与热Key

    https://www.cnblogs.com/jelly12345/p/16424080.html 如何定义大 Key 和 热 Key 如何定义大 Key 如何定义热 Key 大 Key 和 热 K ...

  6. [转帖]2022年 SRE、DevOps技能图谱

    https://zhuanlan.zhihu.com/p/568752990 在过去一段时间,我面试过一些 DevOps 相关从业者,并且曾经收到过一些知乎小伙伴的提问,针对于 DevOps 以及相关 ...

  7. [转帖]远超DDR4,速度可达DDR5 6400!DDR5内存技术、产品解析

    https://www.sohu.com/a/326810241_616364 内存是计算机技术的重要组成部分,经历了长时间的竞争更替和路线选择之后,PC内存技术被稳定在以DDR技术为基础的发展路线上 ...

  8. How to Use Github

    C:\Windows\System32\drivers\etc\hosts 在最后加上一句 20.205.243.166 github.com 从 https://ping.chinaz.com/ 来 ...

  9. Spring Boot 统一RESTful接口响应和统一异常处理

    一.简介 基于Spring Boot 框架开发的应用程序,大部分都是以提供RESTful接口为主要的目的.前端或者移动端开发人员通过调用后端提供的RESTful接口完成数据的交换. 统一的RESTfu ...

  10. axios发送请求时携带token

    请求头携带token async getUserlist(){ // 需要授权的Api,必须在青丘头中使用Authorization 字段提供token令牌 const AUTH_TOKEN=loca ...