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

问题现象

  • 操作文档类功能,大量大对象直接进入老年代,没有在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. [转帖]Linux 性能监控 Sar (Sysstat) 示例

    https://bbs.huaweicloud.com/blogs/345343#   [摘要] 使用 sar,您可以实时监控各种 Linux 子系统(CPU.内存.I/O..)的性能,还可以持续收集 ...

  2. [转帖]企业nginx简单配置

    https://www.jianshu.com/p/6a3e298b31be 第五章 企业简单应用 网站访问方式 1.基于域名访问www.baidu.com 基于IP地址访问172.16.1.7配置文 ...

  3. [转帖]MIPS和ARM授权差异引起的龙芯路线变迁

    https://zhuanlan.zhihu.com/p/99807721 一.MIPS和ARM授权的异同 MIPS授权和ARM授权都分为处理器核授权(Core License)和架构授权(Archi ...

  4. [转帖]关于F5负载均衡你认识多少?

    https://www.cnblogs.com/xiexun/p/10718348.html 网络负载均衡(load balance),就是将负载(工作任务)进行平衡.分摊到多个操作单元上进行执行,例 ...

  5. Redis-dump Docker搭建的快速指南

    背景 最近学习redis想能够将dump文件进行导入处理. 看到比较好的办法都是使用ruby ,但是公司的网络太感人了. 想着比较简单的办法是通过docker方式来搭建. 这里简单记录一下搭建过程. ...

  6. (数据科学学习手札157)pandas新增case_when方法

    本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 大家好我是费老师,pandas在前不久更新的2. ...

  7. 手撕Vue-实现计算属性

    前言 经过上一篇的学习, 完成了将数据代理到了 Nue 的实例上方,这个我们已经撕完了.接下来要实现的是计算属性,计算属性的实现原理是通过 Object.defineProperty() 来实现的,我 ...

  8. 通过Demo学WPF—数据绑定(一)✨

    前言 想学习WPF,但是看视频教程觉得太耗时间,直接看文档又觉得似懂非懂,因此想通过看Demo代码+文档的方式进行学习. 准备 微软官方其实提供了WPF的一些Demo,地址为:microsoft/WP ...

  9. 未能加载文件或程序集“System.ValueTuple, Version=0.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51”或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配。

    一些老的项目在使用SAEA.Socket相关库后,程序本地测试正常,结果上传到服务器上后提示:未能加载文件或程序集"System.ValueTuple, Version=0.0.0.0, C ...

  10. SqlSugar入门

    SqlSugar入门 创建对象 你可以使用 SqlSugarClient (new模式)或者 SqlSugarScope (单例) 对数据库进行增.删.查.改等功能 注意:除了名字和使用模式不同,功能 ...