首先我要明确这里讨论的不是线程中你所引用的变量的存储地址,而是线程本身的栈存储
如果初始化了一个线程池,应该最大线程数可以设置为多少?很多人都说试一下或者计算一下最大值,做个溢出设置就OK了,但是最大值到底可以设置为多少,其实是可以计算出来的.大多数人都知道-Xss参数可以指定一个线程的栈大小,那么按照默认的1MB(大多数,其实操作系统不同默认值不同.)计算,可以设置多少?
当然此时还应询问,操作系统有多少内存,jvm分配了多少内存.那么在通常情况下 liunx系统8gb,JVM启动参数-Xms2048m情况下可以创建多少线程?
其实在Java程序中创建的每个线程都有自己的堆栈空间。所使用的堆栈空间是不从JVM堆中分配的。如果你看看在你的JVM使用的内存的OS报告,你可能会发现,使用的内存比-Xmx参数要多。这是其实就是线程堆栈存储的内存导致。并且线程栈的存储内存未包含在由-Xms和-Xmx指定的JVM堆内。
线程堆栈用来推栈帧嵌套的方法调用。如果嵌套太深,线程运行的空间不够,就会出现StackOverflowError。
默认的线程堆栈大小与JVM,OS和环境变量而异。jdk7 liunx64位操作系统下,默认的通常大小是1MB。这意味着,如果你的应用程序使用150线程,150MB将用于线程堆栈。在某些环境中的默认值栈是2MB。随着大量线程,这会消耗更多的内存,您的应用程序或操作系统中使用的内存量会显著增加。
如果看到这里,那么上面的问题应该对于你来说不算是个问题了吧?
其实在大多数应用中,128K是足够的栈大小。使用-Xss JVM参数指定一个较小的堆栈(-Xss128k),在调整后,如果你没有看到你的应用程序运行的堆栈空间溢出,说明是合适的。
道友请留步 2025-03-26
道友请留步 2025-03-26
藏家708 2025-03-26
leoaim 2025-03-25
恭明惠 2025-03-26
藏家468 2025-03-26
藏家101 2025-03-25
藏家101 2025-03-25
藏家101 2025-03-25
藏家068 2025-03-25