java基础--->java运行原理
方法区
- 用来储存加载类的信息,常量,静态变量,编译后的代码、字节码等
- 虚拟机中这一块是一个逻辑区域,具体实现是由不同的虚拟机来实现的
- 比如oracl的HostSpot在java7中方法区是放在永久区中,java8又是放在元数据区
堆内存
- 用来存放对象的区域
- 又可以分为老年代,新生代(Eden、from survivor、 To survivor)
- jvm创建时用于存放对象实例、垃圾回收器主要就是管理堆内存。
- 如果堆内存慢了就会出现内存溢出等异常。
虚拟机栈
- 每个线程在这个空间都有一个私有的空间
- 线程栈由多个栈帧组成
- 一个线程会执行一个或者多个方法,一个方法对应一个栈帧
- 栈帧内容包括:局部变量、操作数栈、动态链接、方法返回地址、附加信息等
- 栈内存默认最大1M,超出则会抛出StackOverFlowErroy
本地方发栈
- 也是一个线程独占的空间
- 和虚拟机栈功能类似,虚拟机栈是为虚拟机执行java方法的空间。本地方法栈是为虚拟机执行Native本地方法而准备的
- 虚拟机规范没有规定具体的实现,由不同的产商去具体实现
- 栈内存默认最大1M,超出则会抛出StackOverFlowErroy
程序计数器
- 记录当前字节码的执行位置,储存是当前字节码的指令地址
- 如果是执行Native本地方法,则计数器值为空
- 每个线程都在这个空间有一个私有空间,占用内存很少
- CPU同一时间,只会执行一条线程指令,JVM多线程多轮流切换并分配CPU的执行时间方式。
- 为了线程切换后,需要通过程序计数器来恢复到正确的执行位置
代码具体执行
- java编译后会默认给一个无参构造函数
- jvm会创建一个线程来执行代码
- 根据字节码指令,按顺序先压入虚拟机栈的操作数栈,然后再放入本地变量表,遇到方法后,又从本地变量表取出值去执行方法后,又压入操作数栈里面去。
- 这个时候如果有新方法进来,jvm会创建一个新的操作数栈,又执行上述逻辑,
编译命令
javac xxxx.java
javap -v xxxx.class >xxxx.text