服务出现了oom:



查看类信息发现char[]类型实例特别多,占用堆内存特别大



跟踪几个char[]实例的GC root,发现都是保存token信息,并且根都是session



然后查看session的个数,发现有63W



我是用100并发压测的为什么会产生那么多个session?我突然想到我们是前后端分离的,那么前端ajax的时候有没有保持session呢,我调试了下发现我们没有保持session

通过计算

100个并发的话,每个产生一个session,10多分钟后oom,差不多就是100(并发数)*2(每个ajax2个sesionId)*10(十分钟)*60(60秒)*5(5个接口)正好60w

发现oom原因,就是因为前后端分离后没有做好保持session的工作

解决方案

方案1:禁用session

优点:修改简单

缺点:使用session的地方需要替换了,假如使用了session的地方比较多,那么修改工作量就会变大

方案2:使用session共享

优点:可以解决每次ajax都要带token的问题,减少数据传输的大小,减轻带宽压力;修改也相对简单

做法

后台

服务提供者中做以下配置

1、导入依赖

<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>

2、开启session共享(是通过redis来解决的)

spring:
session:
store-type: redis #开启session共享

3、配置redis

redis:
host: localhost
port: 6379
password: 123456

4、在启动类中开启session共享

@SpringBootApplication
@EnableRedisHttpSession //开启session共享

网关中需要做同样的配置

1、导入依赖

<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>

2、开启session共享(是通过redis来解决的)

spring:
session:
store-type: redis #开启session共享

3、配置redis

redis:
host: localhost
port: 6379
password: 123456

4、配置网关

需要在网关中配置不过滤session

zuul:
routes:
user:
path: /user/**
serviceId: CLOUD-MALL-USER
sensitive-headers: #把sensitive-headers设置为空,session不过滤

5、在启动类中开启session共享

@SpringBootApplication
@EnableFeignClients
@EnableZuulProxy
@EnableRedisHttpSession //开启session共享
前端

1、前端引入axios时,在main.js中做一个全局设置,设置允许携带cookie发起请求。

import axios from 'axios'    //导入axios
axios.defaults.withCredentials = true //全局设置axios允许携带cookie进行访问
Vue.prototype.$axios = axios

记录一次排查OOM的过程的更多相关文章

  1. 内存快照排查OOM,加密时错误方法指定provider方式错误引起的OOM

    写在前面: 最近开始总结内存方面的东西,已经总结以前遇到的一些内存案例分享下,接下来还有几篇,然后是进程/线程相关的,逐渐形成我的知识体系树 如果你有兴趣,可以文章末尾的公众号二维码一起梳理这些信息. ...

  2. 记录一些在用wcf的过程中走过的泥巴路 【第一篇】

    自从转移战场之后,比以前忙多了,博客也没能及时跟上,原本准备继续mvc系列,但是在那边技术比较陈旧还没能用得上,话说有3年没接触这玩意了,东西也 都忘了差不多了,既然再次接触,我也就继续温习温习,记录 ...

  3. 记录一次追踪@AutoWired的过程

    目录 记录一次追踪@AutoWired的过程 前言 疑惑:依赖究竟是怎么自动注入的 AutoWiredAnnotationBeanPostProcessor中探究 自动注入debug流程追踪 dete ...

  4. 记录一次OOM分析过程

    工具: jstat jmap jhat 1.jstat查看gc情况 S0C.S1C.S0U.S1U:Survivor 0/1区容量(Capacity)和使用量(Used) EC.EU:Eden区容量和 ...

  5. 记录一次排查使用HttpWebRequest发送请求的发生“基础连接已关闭:接收时发生错误”异常问题的过程

    描述:某次更新程序,需要给测试员MM测试,之前都是正常的,更新后给MM测试就报异常System.Net.WebException 基础连接已经关闭:接收时发生错误 -------> System ...

  6. 记录一个排查oom思路

    一.背景 客户反馈系统白屏,同时运维反馈内存占用多.项目包括数据库等,是部署在不同docker里的 二.查linux日志是linux将mysql杀掉了 egrep -i -r 'killed proc ...

  7. 记录一个前端bug的解决过程

    人在江湖飘,哪能不挨刀. 我挨了重重一bug.严格来讲这可能是我职业生涯以来的首个悲惨经历,因为凭我的知识储备和经验,基本上任何可重现的bug都是可解的.然而这个bug却困扰了我三个月之久,它具有以下 ...

  8. 记录一次排查log4cxx库按照日期回滚,不创建新目录的BUG

    目录 1.背景 2.排查步骤 2.1.错误代码定位 2.2.问题猜测 2.3.错误代码分析 2.4.错误原因 3.解决方法 1.背景 C++ 项目,使用了 log4cxx 日志库,版本为:0.10.0 ...

  9. Elasticsearch 的坑爹事——记录一次mapping field修改过程

    Elasticsearch 的坑爹事 本文记录一次Elasticsearch mapping field修改过程 团队使用Elasticsearch做日志的分类检索分析服务,使用了类似如下的_mapp ...

  10. 记录整合sprinmvc+log4j的的过程

    简介 由于进一步的学习以及便于自己更好的调试程序中遇到的错误,开始了将log4j整合到web项目中,项目是基于springmvc的,所以就做了一个springmvc和web项目的整合demo,本篇博客 ...

随机推荐

  1. pyqt5中文教程

    本文转载自:http://code.py40.com/pyqt5/ 一.PyQt5基本功能 简单的例子 PyQt5是一种高级的语言,下面只有几行代码就能显示一个小窗口.底层已经实现了窗口的基本功能. ...

  2. jenkins-构建触发器之定时构建和轮询 SCM

    前言 最近搭建自动化框架,跑自动化用例每次都得用手工点击构建任务,我们希望能每天固定时间跑,这样就不用管了,坐等收测试报告结果就行 定时构建语法 五颗星,中间用空格隔开 * * * * * 第一颗*表 ...

  3. win系统airtest+pytest-xdist服务器分布式运行。

    1.准备至少两台服务器,集群全部是局域网,(启动脚本的时候可以使用外网ip). 2.输出的报告地址,需要把文件夹设置成共享文件夹,(连接的时候使用内外ip). 启动脚本文件 import os, da ...

  4. TCAM and CAM memory usage inside networking devices(转)

    TCAM and CAM memory usage inside networking devices Valter Popeskic Equipment and tools, Physical la ...

  5. 「SOL」网络流flow (模拟赛)

    题面 给定一张分层有向图,有 \(n\) 层,每层有 \(m\) 个点.只有从第 \(i\) 层的点连向第 \(i + 1\) 层的点的连边. 记 \(A(i,j)\) 表示从第 \(i\) 层的某些 ...

  6. CSP202104-4校门外的树

    `#include include include include include include include include include include include include us ...

  7. B - Yet Another Palindrome Problem

    B - Yet Another Palindrome Problem 思路: 给一个长为n(≤5000≤5000)的数组,问是否存在一个长度至少为3的子序列是回文的.回文的定义是把序列reverse, ...

  8. supervisor+gunicorn+uvicorn部署fastapi项目

    一.编写一个项目 本项目是在虚拟环境下的: 先启动虚拟环境:source .venv/bin/activate.(创建虚拟环境自己去找) 项目用于演示,所以非常简单, 在虚拟环境中安装需要的第三方库: ...

  9. 直播软件搭建,姓名,身份证input验证过滤

    直播软件搭建,姓名,身份证input验证过滤 姓名验证:需求,可输入英文.汉字 for(let i=0;i<e.length;i++){  if(/^[a-zA-Z\u4e00-\u9fa5]+ ...

  10. Delphi针对双字节字段处理

    针对有些特殊的中文字如"错畸形安氏I类"中""字,属于特殊字符,在Oracle数据库中必须以双字节方式存储,字段定义为nVarchar2(100). 在Delp ...