若是要运行Java程序,首先要编写Java的源文件(*.java)之Java的编译器将源文件编译成对应的字节码文件(*.class文件),以后再经过类加载器将字节码文件(*.class)加载到jvm中,其中在 jvm 中与程序运行最密切的是运行时数据区( Runtime data area)。java
要把class文件加载到jvm中的运行时数据区进行处理。面试
程序的运行最为重要的一块区域就是运行时数据区,其中运行时数据区能够分为以下几个子区域:spring
程序计数器是用于存放下一条指令所在单元的地址的地方。设计模式
程序执行必须知道指令(计算机要经过指令才能执行),此时就须要从程序计数器中读取即将执行的指令的地址,经过这个地址就能够获得指令从而执行。数组
好比线程即将执行一个Java方法,此时要先从程序计数器中取得即将执行的虚拟机字节码指令的地址。微信
该区域是线程私有的,虚拟机栈的生命周期和线程相同,在执行一个Java方法的时候会在该区域建立一个栈帧,栈帧用来保存局部变量表(在方法中定义的变量或者方法的参数都是方法的局部变量)、动态连接、方法出口、操做数栈等等信息,其实每一个方法从执行到执行完毕就是一个入栈与出栈的过程。当入栈的速度大于出栈的速度的时候会出现栈内存溢出( Exception in thread "main" java.lang.StackOverflowError)。jvm
本地方法栈和虚拟机栈的做用很类似,不一样点是虚拟栈是为Java方法服务的,本地方法栈是为native方法服务的(这种本地方法是没有方法体的,能够算是一个抽象方法,具体的实现是本地操做系统的c语言写的一些函数库中的方法实现的)分布式
堆是运行时数据区中最大的一块子区域,建立的实例对象和数组都须要在堆内存开辟空间,堆空间是线程共享的区域,该区域也是gc (垃圾回收)重要从狸的一个区,因此堆又被称为“GC堆”。ide
永久代实现了方法区,永久代是在JDK1.8以前出现的概念,在JDK1.8开始就没有了永久代,而是使用了元空间代替了。函数
方法区也是一块线程共享的区域,该区域主要保存的是已经加载到jvm 中的类的信息、常量、静态变量等等。
有完整的Java初级,高级对应的学习路线和资料!专一于java开发。分享java基础、原理性知识、JavaWeb实战、spring全家桶、设计模式、分布式及面试资料、开源项目,助力开发者成长!
详细的java系统视频免费学习地址
欢迎关注微信公众号:码邦主