前言:
在服务器Linux(内存32G)下执行加密算法,入参是1G时发现了内存崩溃问题,直接杀死了Java进程,所以需要在Windows调试代码看是否能重现此问题。Windows的内存小,入参是300M就出现了,后来排查到原因是因为执行程序需要的内存超过了运行机器的内存。
Linux执行时内存的效果:
Windows执行:
在运行Java代码时,出现A fatal error has been detected by the Java Runtime Environment, C [VCRUNTIME140.dll+0x1989]
根据执行的日志,报错具体信息在hs_err_pid18804.log
查看hs_err_pid18804.log,找到引起VCRUNTIME140.dll的相关类和相关调用文件
执行机器资源:
压测客户端操作系统 | Windows 10 家庭中文版 64 位操作系统, 基于 x64 的处理器 |
压测客户端IP地址 | 10.1.7.63(个人机器) |
CPU | 11th Gen Intel(R) Core(TM) i7-1165G7 @ 2.80GHz 2.80 GHz cpu cores : 4 8个线程 |
内存 | 16.0 GB (15.7 GB 可用) |
已知:执行电脑内存16G,已使用了50%,只剩下8G可用。
本次加密算法执行入参:300M,8个线程同时多线程执行。
原因分析:入参的参数是:300M,出参300M,加密过程需要300+150M内存,1.05*8=8.4G,超出了内存,导致内存崩溃。
所以出现了上面问题。
解决办法:有4种方式
1、执行机器执行该程序时,其他程序都关闭
2、执行机器加大内存
3、测试时不输入太大的入参。
4、修改代码,能够判断内存大小大于入参的4倍,才会执行加密算法。
最好的方式应该是4。目前临时做法是:2