服务出现了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. webpack5 与webpack4 之间差别

    1.terserPlugin webpack4 上需要下载安装 terser-webpack-plugin 插件,并且需要配置,webpack5 上生产模式下默认开启压缩,开发环境也可以按如下配置 / ...

  2. Blockchain for Edge of Things: Applications, Opportunities, and Challenges

    物联网:物联网设备,如传感器和手机,负责从物理环境中生成或收集数据,然后通过接入点或基站传输到附近的边缘服务器(ES).具有某些资源的物联网设备(例如,智能手机和笔记本电脑)可以充当移动区块链实体进行 ...

  3. golang windows程序获取管理员权限(UAC )

    在windows上执行有关系统设置命令的时候需要管理员权限才能操作,比如修改网卡的禁用.启用状态.双击执行是不能正确执行命令的,只有右键以管理员身份运行才能成功.为解决此问题,花了很长时间找了各种方法 ...

  4. DC约束笔记

    关于get_pins get_cells get_ports等的定义 关于建立保持与max/min的关系 2.setup time和hold time 建立时间(setup time)是指在触发器的时 ...

  5. Linux-samba共享

    CentOS8 中 Samba环境搭建(满足Linux和Windows系统之间文件共享传输) Samba服务器通信协议(Server Messages Block)就是是为了解决局域网内的文件或打印机 ...

  6. Error:java: 无效的目标发行版: 9

    今天碰到一个编译问题,起先以为是jdk版本问题,但是查看了下,发现版本没错. 顿时有一种怀疑人生的感觉. 然后网上找了许久,终于让我找到答案: 下面直接上解决方案: 将版本9改为8,保存,测试运行,可 ...

  7. Cleanest XMaster绿色解压最新版下载9.6密钥激活码

    cad安装报错换了好几个版本都不行,用这个卸载了一下,确实有用 Cleanest XMaster绿色版cad卸载工具分享下载 地址一(百度网盘) 地址二(直接下载) 9.6.05密钥:[AtrXShX ...

  8. Mac 安装nvm

    根据命令安装 nvm: curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash 当前窗口执行nv ...

  9. uniapp获取本机所有应用包名

    huoqu(e){ uni.showLoading({ title: '获取中' }); const main = plus.android.runtimeMainActivity(); let pM ...

  10. js实现点击按钮或div显示与隐藏div

    var box = document.getElementById("box"); var btn = document.getElementById("btn" ...