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 攻击来源。

相关推荐
爱敲键盘的猴子6 分钟前
Java Spring -- 声明式事务控制
java·spring·事务控制
爱编程的小新☆12 分钟前
【LeetCode】从递归到 Flood Fill:5 道题吃透 DFS 的选择、回溯与标记
java·算法·leetcode·深度优先·回溯·flood fill
weixin_3831964719 分钟前
java基础面试题@Autowired和@Resource区别
java·开发语言
evans在进步22 分钟前
LeetCode 33:搜索旋转排序数组——Java 两阶段二分查找详解
java·python·leetcode
Web Security Loop1 小时前
MAC卸载JDK环境
java·macos·jdk
Rain的Java大神之路2 小时前
线上接口负载满了如何解决
java·数据库·redis·后端·缓存·面试·架构
counting money2 小时前
Tomcat 专题:从基础架构到性能调优与 WebSocket 实战
java·websocket·tomcat
xiaohaiAIgeo3 小时前
【2026年】HG/T 20656-2024化工暖通空调设计规范:新版标准的变化与影响
java·前端·javascript·科普知识
小强库计算机毕业设计3 小时前
基于 Spring Boot + Vue3 的校园管理系统
java·spring boot·后端·项目实战·管理系统·技术分享·校园管理系统实战
霸道流氓气质3 小时前
Java中信号量(Semaphore):从本地到分布式
java·开发语言·分布式