java性能安全:OOM问题排查、Arthas分析高CPU问题、防止Dos攻击

一、OOM问题

分析流程:

第一步:进程分析,分析老年代回收次数和消耗时间

第二步:日志分析,找出OOM发生时间的日志来锁定执行方法,对应的机器ip

第三步:找到对应的ip机器查看,进一步分析

第四步:下载的dump,使用mat分析堆内存,找到堆占用率前3,查看堆指向

问题产生:

例如查看新生代最高600M,如果大数据量调用,jvm会把产生的大对象分配在新生代,新生代full gc后放到老年代,老年代gc后触发OOM,就会像类似死循环一样,一直full gc了

解决方案:

1、临时方法:

① 先进行扩容

② 先将任务先降下来

2、后续解决问题方案:

① 计算密集型服务与 IO/ 存储密集型服务分割开来,这样做的一个主要原因是提高资源利用率,方便分配资源的时候做到定向调拨,通过全链路压测环节精准定位各项性能指标

② 新生代放设置,设置老年代是新生代的 2 倍大;换句话说,新生代是堆大小的 1/3。

③ 大数据量存储进行报警,比如,我们去分配一个超大对象,类似一个超大数组超过堆的最大值,JVM 可以判断出垃圾收集并不能解决这个问题,所以直接抛出 OutOfMemoryError。

二、Arthas分析高CPU问题:

优点:

1、快速定位和修复问题的一站式服务

使用方法:

1、dashboard + thread 命令,基本可以在几秒钟内一键定位问题,找出消耗 CPU 最多的线程和方法栈;

① dashboard 命令用于整体展示进程所有线程、内存、GC 等情况,分析占用CPU 较多的线程

② 使用thread -n查看最放慢的线程在执行的线程栈,找到执行的方法

2、直接 jad 反编译相关代码,来确认根因

3、如果调用入参不明确的话,可以使用 watch 观察方法入参,并根据方法执行时间来过滤慢请求的入参。

4、由于 monitor、trace、watch 等命令是通过字节码增强技术来实现的,会在指定类的方法中插入一些切面来实现数据统计和观测,因此诊断结束要执行 shutdown 来还原类或方法字节码,然后退出 Arthas。

三、拒绝服务(DoS)攻击

注意点:

1、利用哈希碰撞攻击,可以轻易消耗系统有限的 CPU 和线程资源。

2、类似加密、解密、图形处理等计算密集型任务,都要防范被恶意滥用,以免攻击者通过直接调用或者间接触发方式,消耗系统资源。

3、Java 构建类似上传文件或者其他接受输入的服务,需要对消耗系统内存或存储的上限有所控制,因为我们不能将系统安全依赖于用户的合理使用。

4、Java 程序中需要明确释放的资源有很多种,比如文件描述符、数据库连接,甚至是再入锁,任何情况下都应该保证资源释放成功,否则即使平时能够正常运行,也可能被攻击者利用而耗尽某类资源,这也算是可能的 DoS 攻击来源。

相关推荐
缺点内向2 小时前
Java:创建、读取或更新 Excel 文档
java·excel
带刺的坐椅2 小时前
Solon v3.4.7, v3.5.6, v3.6.1 发布(国产优秀应用开发框架)
java·spring·solon
四谎真好看4 小时前
Java 黑马程序员学习笔记(进阶篇18)
java·笔记·学习·学习笔记
桦说编程4 小时前
深入解析CompletableFuture源码实现(2)———双源输入
java·后端·源码
java_t_t4 小时前
ZIP工具类
java·zip
lang201509284 小时前
Spring Boot优雅关闭全解析
java·spring boot·后端
pengzhuofan5 小时前
第10章 Maven
java·maven
百锦再6 小时前
Vue Scoped样式混淆问题详解与解决方案
java·前端·javascript·数据库·vue.js·学习·.net
刘一说6 小时前
Spring Boot 启动慢?启动过程深度解析与优化策略
java·spring boot·后端
壹佰大多6 小时前
【spring如何扫描一个路径下被注解修饰的类】
java·后端·spring