1.JVM运行时数据区和内存模型:
参考: https://www.cnblogs.com/czwbig/p/11127124.html,写的很漂亮,转载一下,另外总结一下各个区域的异常溢出
对于这个图,虚拟机栈和本地方法栈相关的溢出少了个OutOfMemoryError,(也是书上的例子,做个总结):
对于HotSpot虚拟机,-Xoss参数可设置本地方法栈大小,但是实际上没有效果,只能通过-Xss参数决定。(Classic虚拟机可以使用-Xoss参数,并生效)
如果设置参数不允许动态扩展栈容量大小,那么无论是由于栈帧太大(比如,大量声明局部变量),还是虚拟机栈容量太小(无限递归,过多占用大量的容量也可以),当新的栈帧内存无法分配的时候,HotSpot虚拟机抛出的都是StackOverflowError异常。
如果,允许动态扩展栈容量大小(同时,限制方法栈的内存很小),那么可能出现的另外一种情况就OutOfMemoryError;换句话说,给每个线程的栈分配的内存越大,可建立的线程数就会越少,在建立过多的线程的时候,导致内存不够用,出现OutOfMemoryError
关于对象头和java锁的相关文章可以参考,JAVA对象头详解和java对象在内存中占用大小:
https://www.cnblogs.com/zhouwangwang/p/13763887.html
https://blog.csdn.net/qq_28911061/article/details/105348127