1.JVM运行时数据区和内存模型:
参考: https://www.cnblogs.com/czwbig/p/11127124.html,写的很漂亮,转载一下,另外总结一下各个区域的异常溢出
对于这个图,虚拟机栈和本地方法栈相关的溢出少了个OutOfMemoryError,(也是书上的例子,做个总结):
对于HotSpot虚拟机,-Xoss参数可设置本地方法栈大小,但是实际上没有效果,只能通过-Xss参数决定。(Classic虚拟机可以使用-Xoss参数,并生效)
如果设置参数不允许动态扩展栈容量大小,那么无论是由于栈帧太大(比如,大量声明局部变量),还是虚拟机栈容量太小(无限递归,过多占用大量的容量也可以),当新的栈帧内存无法分配的时候,HotSpot虚拟机抛出的都是StackOverflowError异常。
如果,允许动态扩展栈容量大小(同时,限制方法栈的内存很小),那么可能出现的另外一种情况就OutOfMemoryError;换句话说,给每个线程的栈分配的内存越大,可建立的线程数就会越少,在建立过多的线程的时候,导致内存不够用,出现OutOfMemoryError
2. JVM 堆 VS 本地内存
https://www.jianshu.com/p/60afb21c8876
另摘自美团(Java中9种常见的CMS GC问题分析与解决):Java 8 的内存结构简略图以及垃圾回收区域:
GC 主要工作在 Heap 区和 MetaSpace 区(上图蓝色部分),在 Direct Memory 中,如果使用的是 DirectByteBuffer,那么在分配内存不够时则是 GC 通过 Cleaner#clean
间接管理。
3.关于对象头和java锁的相关文章可以参考,JAVA对象头详解和java对象在内存中占用大小:
https://www.cnblogs.com/zhouwangwang/p/13763887.html
https://blog.youkuaiyun.com/qq_28911061/article/details/105348127