栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

使用 Java 故意消耗 Cpu 和内存的代码

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

使用 Java 故意消耗 Cpu 和内存的代码

为什么要故意消耗 Cpu 和内存?在项目交付时有时会申请一定的资源进行项目程序代码的部署,一般会预留一些 Cpu 和内存,以便后续扩展项目时能有足够的资源,但有时往往要求很严格,会时不时的检查你的服务器的 cpu 及内存有没有达到一定的使用率要求,如要求 cpu 使用率在 60%以上,内存在 70%以上,如果发现没有达到,为了节省资源,则可能会将配置回收,比如减掉你的 cpu 及内存数量,基于此,使用 Java 程序来空跑业务,来消耗 Cpu 及内存。

1.直接上代码

就一个 Java 类,如下:

import java.util.Vector;



public class ResouceManageService {

  //是否跑消耗内存代码的标记,默认否,即跑消耗Cpu的代码
  private static boolean memConsume = false;

  public static void main(String[] args) throws Exception {
    
    final ResouceManageService service = new ResouceManageService();
    
    int num = 1;
    
    for (int i = 0; i < args.length; i++) {

      //指定-m表明跑消耗内存,指定-c或不指定为消耗Cpu,
      if ("-c".equals(args[i])) {
        
      } else if ("-m".equals(args[i])) {
        memConsume = true;
        num = Integer.parseInt(args[i + 1]);
        i++;
      }
      
    }
    
    if(memConsume){

      service.memConsume(num);

    }else {
      
      service.cpuConsume();
      
    }
    
  }
  
  //只内存消耗调用这个方法
  @SuppressWarnings("unchecked")
  public void memConsume(int num){

    //执行一个for循环进行新生代内存的申请,共消耗num数量GB
    for(int i=0;i 
2.消耗 Cpu 命令 

因为是消耗 Cpu,因此在配置 Jvm 时使用了最少的 64M 进行启动,如下

java -XX:InitialHeapSize=64m -XX:MaxHeapSize=64m -XX:NewSize=32m -XX:MaxNewSize=32m -XX:+UseParNewG

3.消耗内存命令
java -XX:InitialHeapSize=4096m -XX:MaxHeapSize=4096m -XX:NewSize=3072m -XX:MaxNewSize=3072m -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:PretenureSizeThreshold=500m -cp "." ResouceManageService -m 1 &

参数说明:-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 -m 1 &

XX:PretenureSizeThreshold 设置成了 500MB,是因为我的代码的这一句,byte b1[] = new byte[104857600]; //100M,里面一次申请内存就 100M,为避免申请的对象进入老年代,将 XX:PretenureSizeThreshold 设置调大了

以上命令,可考虑放在shell中保存,以方便执行,如:
####vi start-cpu.sh
#!/bin/sh
java -XX:InitialHeapSize=64m -XX:MaxHeapSize=64m -XX:NewSize=32m -XX:MaxNewSize=32m -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:PretenureSizeThreshold=10m -cp "." ResouceManageService &

####vi start-mem.sh
#!/bin/sh
java -XX:InitialHeapSize=4096m -XX:MaxHeapSize=4096m -XX:NewSize=3072m -XX:MaxNewSize=3072m -XX:+Use

 

小伙伴们有兴趣想了解内容和更多相关学习资料的请点赞收藏+评论转发+关注我,后面会有很多干货。如果在阅读过程中有疑问,请留言讨论.

作者  不想秃头

原文出处:使用Java故意消耗Cpu和内存的代码_Java_不想秃头_InfoQ写作社区

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/877672.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号