工作中没用过多线程,第一次使用多线程,就直接使用new Thread(),一到线上环境就GG了,之后使用下面的方式解决这个问题
ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueueworkQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler);
虽然很熟悉创建多线程的方式:实现Runnable接口和继承Thread类,但是这些并不适用于生产环境,最好使用线程池来实用多线程的方法。线程池可以管理线程、复用线程,减少线程频繁新建、销毁等带来的开销。频繁的new Thread就会炸了。
问题二、产生大量临时对象对于这种情况,能复用临时对象就复用,new 大量的对象,占据了大量内存。
问题三、产生大量的log打印大量的日志,虽然没遇到过GC的情况,但是还真遇到项目卡的情况。之前写过这篇文章,可以去看看
记录工作中遇到的坑以及解决办法
第一次遇到这种问题,当用map存储大量数据的时候,会导致GC异常。Map
@Test public void test09() { long startTime = System.currentTimeMillis(); Map> hashMap = new HashMap<>(); for(int i = 0;i < 10000000; i++) { Set 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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)