线程池实验

内存设置(java8)

Java8默认的初始堆内存、最大堆内存根据系统而不同而不同,如下表所示:

参数名称含义默认值说明
-Xms初始堆内存物理内存的1/64默认(MinHeapFreeRatio参数可以调整)空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制. 等价于-XX:InitialHeapSize
-Xmx最大堆内存物理内存的1/4默认(MaxHeapFreeRatio参数可以调整)空余堆内存大于70%时,JVM会减少堆直到 -Xms的最小限制 等价于-XX:MaxHeapSize

oracle官方手册里提到,默认的大小根据系统的不同而不同,比如-client模式还是-server模式。

查看默认参数

java -XX:+PrintFlagsFinal -version 

会打印所有参数。其中InitialHeapSize就是-Xms,MaxHeapSize就是-Xmx。
由于上述的参数打印的结果较多,可以在windows上使用检索命令:

java -XX:+PrintFlagsFinal -version | findstr /i "HeapSize PermSize ThreadStackSize"

linux上检索命令:

java -XX:+PrintFlagsFinal -version | grep -iE 'HeapSize|PermSize|ThreadStackSize'

或者换种方法查看常设置的参数:比如在一台4G的linux机器上查看:

java -XX:+PrintCommandLineFlags -version

输出结果:

-XX:InitialHeapSize=64487744 (约61MB,约内存的1/64)
-XX:MaxHeapSize=1031803904 (约984MB,约内存的1/4)
-XX:+PrintCommandLineFlags 
-XX:+UseCompressedClassPointers 
-XX:+UseCompressedOops 
-XX:+UseParallelGC 
java version "1.8.0_131"
Java(TM) SE Runtime Environment (build 1.8.0_131-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode)

在一台8G内存的linux机器上查看:
输出结果:

-XX:InitialHeapSize=130802560 (约124MB,约内存的1/64)
-XX:MaxHeapSize=2092840960 (约1995MB,约内存的1/4)
-XX:+PrintCommandLineFlags 
-XX:+UseCompressedClassPointers 
-XX:+UseCompressedOops 
-XX:+UseParallelGC 
openjdk version "1.8.0_121"
OpenJDK Runtime Environment (build 1.8.0_121-b13)
OpenJDK 64-Bit Server VM (build 25.121-b13, mixed mode)

自定义堆内存大小

-Xmx20m -Xms5m

阿里开发规范截图

FixedThreadPool

//-Xmx20m -Xms5m
public class ThreadPoolExceptionTest1 {
    public static void main(String[] args) {
        ExecutorService es = Executors.newFixedThreadPool(1);
        while(true){
            es.submit(()->{
                byte[] b = new byte[1 * 1024 * 1024];
                try {
                    TimeUnit.SECONDS.sleep(50);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            });
        }
    }
}
Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceeded
	at java.util.concurrent.Executors.callable(Executors.java:407)
	at java.util.concurrent.FutureTask.<init>(FutureTask.java:152)
	at java.util.concurrent.AbstractExecutorService.newTaskFor(AbstractExecutorService.java:87)
	at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:111)
//-Xmx20m -Xms5m
public class ThreadPoolExceptionTest1 {
    public static void main(String[] args) {
        //ExecutorService es = Executors.newFixedThreadPool(1);
        ExecutorService es = Executors.newSingleThreadExecutor();
        //ExecutorService es = Executors.newCachedThreadPool();
        for (int i = 0; i < 6665535; i++) {
            es.execute(()->{
                byte[] b = new byte[1 * 1024 * 1024];
                System.out.println("进入sleep");
                try {
                    Thread.sleep(50_000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            });
        }
    }
}
Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceeded
//-Xmx20m -Xms5m
public class ThreadPoolExceptionTest1 {
    public static void main(String[] args) {
        //ExecutorService es = Executors.newFixedThreadPool(1);
        //ExecutorService es = Executors.newSingleThreadExecutor();
        ExecutorService es = Executors.newCachedThreadPool();
        for (int i = 0; i < 6665535; i++) {
            es.execute(()->{
                byte[] b = new byte[1 * 1024 * 1024];
                System.out.println("进入sleep");
                try {
                    Thread.sleep(50_000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            });
        }
    }
}

Exception in thread "pool-1-thread-578" java.lang.OutOfMemoryError: Java heap space
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值