记录工作中遇到的GC问题以及解决方案

问题一:多线程 new Thread()

工作中没用过多线程,第一次使用多线程,就直接使用new Thread(),一到线上环境就GG了,之后使用下面的方式解决这个问题

ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler);

虽然很熟悉创建多线程的方式:实现Runnable接口和继承Thread类,但是这些并不适用于生产环境,最好使用线程池来实用多线程的方法。线程池可以管理线程、复用线程,减少线程频繁新建、销毁等带来的开销。频繁的new Thread就会炸了。

问题二、产生大量临时对象

对于这种情况,能复用临时对象就复用,new 大量的对象,占据了大量内存。

问题三、产生大量的log

打印大量的日志,虽然没遇到过GC的情况,但是还真遇到项目卡的情况。之前写过这篇文章,可以去看看
记录工作中遇到的坑以及解决办法

问题四、集合存数据

第一次遇到这种问题,当用map存储大量数据的时候,会导致GC异常。Map<String, Set>结构是hashset嵌套了hashset了,本地测试了1百万和1千万条数据,1百万的时候,还是扛得住,1千万条数据直接抗不住了。感兴趣的可以去试试。

@Test
public void test09() {
    long startTime = System.currentTimeMillis();
    Map<String, Set<String>> hashMap = new HashMap<>();
    for(int i = 0;i < 10000000; i++) {
        Set<String> name = new HashSet<>();
        name.add("" + i);
        hashMap.put("" + i, name);
    }
    long endTime = System.currentTimeMillis();
    long spendTime = endTime - startTime;
    System.out.println(spendTime/1000);
}

我这里了解到hashset会开辟大量的空间,导致空间和时间浪费,当数据量上来了,其后果更加明显。
我改成Map<String, String>结构,存储1千万条数据,还是扛得住,当然,本地配置高,到了线上环境就不一定了。
在这里插入图片描述

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

exodus3

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值