我写了一个小程序。如下:
#include <pthread.h>
#include <limits.h>#define Thread_NUM 5void *MultiThread_soap_serve(){sleep(5) printf("new pthread!!\n")}//PTHREAD_STACK_MIN 经过计算是16K。//64*16K = 1M,线程堆栈应该是够用的。#define MICHAEL_SET_PTHREAD_STACK_SIZE 64int main(){pthread_attr_t attr pthread_attr_init(&attr) size_t stacksize = MICHAEL_SET_PTHREAD_STACK_SIZE*PTHREAD_STACK_MIN //stacksize =PTHREAD_STACK_MIN //stackaddr=(void*)malloc((N+1)*PTHREAD_STACK_MIN) //pthread_attr_getstack(&attr,&statckattr,&stacksize) //pthread_attr_setstack(&attr,stackaddr,) pthread_attr_setstacksize(&attr,stacksize) int iThreadNum = 0 pthread_t PSoapThread[Thread_NUM] for ( iThreadNum <Thread_NUM iThreadNum++ ){pthread_create(&PSoapThread[iThreadNum],&attr,MultiThread_soap_serve,(void *)NULL) }pthread_attr_destroy(&attr) while(1){sleep(10) printf("main!!\n") }}
Thread(ThreadGroup group, Runnable target, String name, long stackSize)分配新的 Thread 对象,以便将 target 作为其运行对象,将指定的 name 作为其名称,作为 group 所引用的线程组的一员,并具有指定的堆栈大小。
jar包启动时指定对应参数,比如我的工程启动命令就是这样的
启动命令,打码部分为工程名
常见参数如下
1.-Xms:初始堆大小。只要启动,就占用的堆大小。
2.-Xmx:最大堆大小。java.lang.OutOfMemoryError:Java heap这个错误可以通过配置-Xms和-Xmx参数来设置。
3.-Xss:栈大小分配。栈是每个线程私有的区域,通常只有几百K大小,决定了函数调用的深度,而局部变量、参数都分配到栈上。
当出现大量局部变量,递归时,会发生栈空间OOM(java.lang.StackOverflowError)之类的错误。
4.XX:NewSize:设置新生代大小的绝对值。
5.-XX:NewRatio:设置年轻代和年老代的比值。比如设置为3,则新生代:老年代=1:3,新生代占总heap的1/4。
6.-XX:MaxPermSize:设置持久代大小。
java.lang.OutOfMemoryError:PermGenspace这个OOM错误需要合理调大PermSize和MaxPermSize大小。
7.-XX:SurvivorRatio:年轻代中Eden区与两个Survivor区的比值。注意,Survivor区有form和to两个。比如设置为8时,那么eden:form:to=8:1:1。
8.-XX:HeapDumpOnOutOfMemoryError:发生OOM时转储堆到文件,这是一个非常好的诊断方法。
9.-XX:HeapDumpPath:导出堆的转储文件路径。
10.-XX:OnOutOfMemoryError:OOM时,执行一个脚本,比如发送邮件报警,重启程序。后面跟着一个脚本的路径。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)