赞
踩
精通Java?来看看下面这些底层中的底层原理
你是否知道吧。
提到JVM必不可少的就得谈到它的内存模型,根据 JVM 规范,JVM 内存共分为虚拟机栈VM stack
、堆heap
、方法区Method Area
、程序计数器Program Counter Register
、本地方法栈Native Method Stack
五个部分。如下图,咋们分别对这五个区域进行详细的原理讲解。(为节省读者的时间,方便大家理解记忆,笔者把全部知识点分层分段,用较短的语言去描述,言简意赅,句句都是重点。)
每个线程有一个私有的栈,随着线程的创建而创建。
能抛出StackOverflowError和OutOfMemoryError异常。
方法调用相关知识:
栈内存指的便是虚拟机栈的栈帧中的局部变量表,因为这里存放了一个方法的所有局部变量。
栈的大小可以固定也可以动态扩展。当栈调用深度大于JVM所允许的范围,会抛出StackOverflowError的错误,不过这个深度范围不是一个固定的值,(我们也可以更改vmoptions文件中的参数来调整其大小,具体参见本文最后的附录,这里先不展开),大家可以通过下面的代码进行测试:
public class HeapDeepDemo { private static int index = 0; public void addIndex() { index++; addIndex(); } public static void main(String[] args) { HeapDeepDemo heapDeepDemo = new HeapDeepDemo(); try { heapDeepDemo.addIndex(); } catch (Error e) { System.out.println("Stack deep : " + index); e.printStackTrace(); } } }
四次执行结果都不同,如下:
Java方法调用本地方法栈的过程如下图:
什么是本地方法栈(Native Method Stack)?
为什么要用到本地方法栈(Native Method Stack)?
本地方法栈的知识点:
程序计数器又可翻译为PC寄存器
,可类比汇编与微机原理中X86架构的CPU中的IP指令指针寄存器,详情可参考本人另外一篇博客:https://blog.csdn.net/MrYushiwen/article/details/122627634
其中的大致内容截取如下:
x86架构的寄存器图如下:(记得我们大学的课本上的图也是这么画的,图片恒永久,一张永流传!哈哈哈)
Java7以及之前的结构图:
在4章节方法区(Method Area)中以及提到过Java8的时候用元空间(Metaspace)替换掉了永久代(PermGen),所以Java8以及之后的图如下:
堆为什么为什么分代:
Minor GC、Major GC和Full GC之间的区别:
HotSpot JVM把年轻代分为了三部分:
年轻代如何变成老年代
打开后的内容如下:
文件路径如下:
文件内容如下:
参数值如下:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。