Java内存区域
运行时数据区域: 程序计数器 : 通过改变计数器的值来选取下一条字节码指令,为了线程切换后能恢复到正确的执行位置,每条线程都有一个独立的程序计数器,即“线程私有”如果线程执行的是Java方法,那么计数器记录的是正在执行的虚拟机字节码指令的地址,如果是native方法,则计数器的值为空,此区域没有OutOfMemoryError情况。 Java虚拟机栈 : 线程私有,描述Java方法执行的内存模型,每个方法都会创建栈帧,用于存储局部变量表、操作数栈、动态链接、方法出口等。。方法调用直至完成,对应栈帧入栈到出栈。局部变量表内存空间在编译期间完成分配,运行期间不会改变其大小。线程请求栈的深度大于所允许的深度,则抛出StackOverflowError异常;如果扩展时无法申请到足够的内存,就抛出OutOfMemoryError异常。 设置本地方法栈大小-Xoss(其实无效,应使用后面的),栈容量只由-Xss设定。 单个线程下,抛出的都是StackOverflowError。 如果是建立过多线程导致的内存溢出,可以通过减少最大堆和减少栈容量(每个线程被分配到的栈大小)来换取更多的线程。 本地方法栈 : 执行Native方法,会有StackOverflowError和OutOfMemoryError异常。 Java堆 : jvm中最大的一块,线程共享,唯一目的是存放对象实例