为什么要故意消耗Cpu和内存?在项目交付时有时会申请一定的资源进行项目程序代码的部署,一般会预留一些Cpu和内存,以便后续扩展项目时能有足够的资源,但有时往往要求很严格,会时不时的检查你的服务器的cpu及内存有没有达到一定的使用率要求,如要求cpu使用率在60%以上,内存在70%以上,如果发现没有达到,为了节省资源,则可能会将配置回收,比如减掉你的cpu及内存数量,基于此,使用Java程序来空跑业务,来消耗Cpu及内存。
1.直接上代码就一个Java类,如下:
importjava.util.Vector;/***Cpu部分代码参考https://blog.csdn.net/java2000_net/article/details/3136124*@authorjxlhl**/publicclassResouceManageService{//是否跑消耗内存代码的标记,默认否,即跑消耗Cpu的代码privatestaticbooleanmemConsume=false;publicstaticvoidmain(String[]args)throwsException{finalResouceManageServiceservice=newResouceManageService();intnum=1;for(inti=0;i<args.length;i++){//指定-m表明跑消耗内存,指定-c或不指定为消耗Cpu,if("-c".equals(args[i])){}elseif("-m".equals(args[i])){memConsume=true;num=Integer.parseInt(args[i+1]);i++;}}if(memConsume){service.memConsume(num);}else{service.cpuConsume();}}//只内存消耗调用这个方法@SuppressWarnings("unchecked")publicvoidmemConsume(intnum){//执行一个for循环进行新生代内存的申请,共消耗num数量GBfor(inti=0;i<num*10;i++){@SuppressWarnings("rawtypes")Vectorv=newVector();byteb1[]=newbyte[104857600];//100Mv.add(b1);/*System.out.println(v);Runtimert=Runtime.getRuntime();System.out.println("freememory"+rt.freeMemory());*/}//内存消耗申请完后,执行死循环休眠,让JVM一直占用申请到的内存,达到一直占用num数量GB的效果while(true){try{Thread.sleep(3600000l);}catch(InterruptedExceptione){e.printStackTrace();}}}//cpu消耗方法publicvoidcpuConsume(){//角度的分割finaldoubleSPLIT=0.01;////2PI分割的次数,也就是2/0.01个,正好是一周finalintCOUNT=(int)(2/SPLIT);finaldoublePI=Math.PI;//时间间隔finalintINTERVAL=200;long[]busySpan=newlong[COUNT];long[]idleSpan=newlong[COUNT];inthalf=INTERVAL/2;doubleradian=0.0;for(inti=0;i<COUNT;i++){busySpan[i]=(long)(half+(Math.sin(PI*radian)*half));idleSpan[i]=INTERVAL-busySpan[i];radian+=SPLIT;}longstartTime=0;intj=0;while(true){j=j%COUNT;startTime=System.currentTimeMillis();while(System.currentTimeMillis()-startTime<busySpan[j]);try{//这里的if控制可以注解掉,让Thread.sleep(idleSpan[j])一直执行。//我这里加了if控制是因为希望Cpu一直保存在70%以上工作的效果(小于70不sleep),If注解掉将以正弦曲线的趋势使用Cpuif(idleSpan[j]<70){Thread.sleep(idleSpan[j]);}}catch(InterruptedExceptione){e.printStackTrace();}j++;}}}2.消耗Cpu命令因为是消耗Cpu,因此在配置Jvm时使用了最少的64M进行启动,如下:
java-XX:InitialHeapSize=64m-XX:MaxHeapSize=64m-XX:NewSize=32m-XX:MaxNewSize=32m-XX:+UseParNewGC-XX:+UseConcMarkSweepGC-XX:PretenureSizeThreshold=10m-cp"."ResouceManageService&3.消耗内存命令java-XX:InitialHeapSize=4096m-XX:MaxHeapSize=4096m-XX:NewSize=3072m-XX:MaxNewSize=3072m-XX:+UseParNewGC-XX:+UseConcMarkSweepGC-XX:PretenureSizeThreshold=500m-cp"."ResouceManageService-m1&参数说明:-m表示消耗内存,无此参数表示消耗Cpu,-m后面的数字1表明消耗1G内存
原理:启动命令时申请最大堆内存4096Mb,新生代3072M,程序在启动时将产生-m后面数字的内存的数据放在list中,然后申请完后,就一直休眠。这样来达到消耗内存不释放的目的。因此-m后面的数据不能超过新生代配置的内存的最大值,如果需要超过,就把最大内存和新生代的内存配置增加后再启动,如需要一次性消号6Gb内存,可用如下示例配置:
java-XX:InitialHeapSize=8192m-XX:MaxHeapSize=8192m-XX:NewSize=7168m-XX:MaxNewSize=7168m-XX:+UseParNewGC-XX:+UseConcMarkSweepGC-XX:PretenureSizeThreshold=500m-cp"."ResouceManageService-m1&
XX:PretenureSizeThreshold设置成了500MB,是因为我的代码的这一句,byteb1[]=newbyte[104857600];//100M,里面一次申请内存就100M,为避免申请的对象进入老年代,将XX:PretenureSizeThreshold设置调大了
以上命令,可考虑放在shell中保存,以方便执行,如:####vistart-cpu.sh#!/bin/shjava-XX:InitialHeapSize=64m-XX:MaxHeapSize=64m-XX:NewSize=32m-XX:MaxNewSize=32m-XX:+UseParNewGC-XX:+UseConcMarkSweepGC-XX:PretenureSizeThreshold=10m-cp"."ResouceManageService&####vistart-mem.sh#!/bin/shjava-XX:InitialHeapSize=4096m-XX:MaxHeapSize=4096m-XX:NewSize=3072m-XX:MaxNewSize=3072m-XX:+UseParNewGC-XX:+UseConcMarkSweepGC-XX:PretenureSizeThreshold=500m-cp"."ResouceManageService-m1&logo设计
创造品牌价值
¥500元起
APP开发
量身定制,源码交付
¥2000元起
商标注册
一个好品牌从商标开始
¥1480元起
公司注册
注册公司全程代办
¥0元起
查
看
更
多
使用Java故意消耗Cpu和内存的代码
1.直接上代码就一个Java类,如下:importjava.util.Vector;\/***Cpu部分代码参考https:\/\/blog.csdn.net\/java2000_net\/article\/details\/3136124*@authorjxlhl**\/publicclassResouceManageService{\/\/是否跑消耗内存代码的标记,默认否,即跑消耗Cpu的代码privatestaticbooleanmemConsume=false;publicstaticvoidmai...
Java如何定位占用CPU比较高的问题
从上图可以看到Java进程 27459 消耗的CPU比较高。二、查找 27459 Java进程消耗CPU线程ID 方式一: top -p [pid] 或 top -H -p [pid]执行命令后按shift + h (显示进程各线程运行情况)1)、top -p 27459 2)、shift + h 如下图:方式二: ps -mp [pid] -o THREAD,tid,time ps -mp 274...
【干货】java项目内存溢出(OOM)的排查方法及原因分析—源自一次真实线上...
为深入了解问题,我采取了《深入理解java虚拟机》中提到的排查方法,如使用top命令查看资源消耗,jstat -gc分析堆内存,记录堆快照文件。通过内存分析工具MemoryAnalyzer,我们发现业务代码中的一个逻辑错误导致了内存泄漏:当查询参数导致关联表数据为空时,代码会进行全表查询,导致大对象的创建和内存消耗激增...
java死循环消耗的哪里的内存
java死循环消耗CPU内存。采用Java的available功能时,网络流无数据的时间造成了无限循环,使CPU的占用比达到50%。
如何查看linux上java实例消耗内存
说明:sar -P ALL > aaa.txt 重定向输出内容到文件 aaa.txt top命令经常用来监控linux的系统状况,比如cpu、内存的使用,程序员基本都知道这个命令,但比较奇怪的是能用好它的人却很少,例如top监控视图中内存数值的含义就有不少的曲解.下面几种方法都可以插件Java实例消耗的内存.top命令是Linux下...
CPU占用100%排查过程
首先,使用top命令确定CPU使用率最高的进程ID(PID),发现PID为15913。添加-H选项后,能进一步查看该进程的线程信息,结果显示最消耗CPU资源的两个线程ID分别为15924和15925,对应的十六进制表示为0x3E34和0x3E35。jstack命令帮助收集线程堆栈信息,通过分析这些信息,能够深入探究可能存在的Java程序问题,...
线上CPU飙升100%问题排查
使用"jmap -dump"导出内存heap数据,分析内存占用。问题原因分析内存消耗过大引发Full GC:通过步骤1-5确定问题并分析原因。代码中大量CPU密集操作:jstack定位到具体代码行,如复杂算法或无限递归。锁使用不当导致死锁:jstack会显示死锁信息,分析业务逻辑。随机接口访问阻塞:通过压测工具找到瓶颈代码,如...
经过top和jstack确定哪些线程耗尽了CPU
2. 定位步骤1. 使用终端1进入目标机器,执行top命令,默认是进程视图,其中PID是进程号,截图如下:在这里,我们只能看到java进程占用CPU达到115%,那么究竟是那些线程非常耗CPU呢?2. 由于我们要看到线程,在终端1,按下“H”键或者“shift+h”,top视图会切换到线程视图,其中PID是线程号,截图如下:...
java 如何获得一个进程的内存使用情况,cpu运行的时间
不过对于cpu使用时间,采用标准java代码倒是可以拿到。由于java的语法很啰嗦,举一个较完全的例子需要太多的代码,我这里就只写最关键的代码:ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();① long currentCpuTime = threadMXBean.getCurrentThreadCpuTime(); \/\/当前线程的cpu使用时间 ...
编Java时CPU使用率达到100%
你说你半天不出结果是吧,那估计是进入死循环了,这样会消耗很多内存的,出现问题会很正常的。如果都动不了了,就用任务管理器删掉所有javaw.exe,这样应该可以了,运行之前要看看循环的判断条件,别死循环了。