java基础--->java运行原理

 

 

 

 

java基础--->java运行原理

 

方法区

  1. 用来储存加载类的信息,常量,静态变量,编译后的代码、字节码等
  2. 虚拟机中这一块是一个逻辑区域,具体实现是由不同的虚拟机来实现的
  3. 比如oracl的HostSpot在java7中方法区是放在永久区中,java8又是放在元数据区

堆内存

  1. 用来存放对象的区域
  2. 又可以分为老年代,新生代(Eden、from survivor、 To survivor)
  3. jvm创建时用于存放对象实例、垃圾回收器主要就是管理堆内存。
  4. 如果堆内存慢了就会出现内存溢出等异常。

虚拟机栈

  1. 每个线程在这个空间都有一个私有的空间
  2. 线程栈由多个栈帧组成
  3. 一个线程会执行一个或者多个方法,一个方法对应一个栈帧
  4. 栈帧内容包括:局部变量、操作数栈、动态链接、方法返回地址、附加信息等
  5. 栈内存默认最大1M,超出则会抛出*Erroy

本地方发栈

  1. 也是一个线程独占的空间
  2. 和虚拟机栈功能类似,虚拟机栈是为虚拟机执行java方法的空间。本地方法栈是为虚拟机执行Native本地方法而准备的
  3. 虚拟机规范没有规定具体的实现,由不同的产商去具体实现
  4. 栈内存默认最大1M,超出则会抛出*Erroy

程序计数器

  1. 记录当前字节码的执行位置,储存是当前字节码的指令地址
  2. 如果是执行Native本地方法,则计数器值为空
  3. 每个线程都在这个空间有一个私有空间,占用内存很少
  4. CPU同一时间,只会执行一条线程指令,JVM多线程多轮流切换并分配CPU的执行时间方式。
  5. 为了线程切换后,需要通过程序计数器来恢复到正确的执行位置

代码具体执行

  1. java编译后会默认给一个无参构造函数
  2. jvm会创建一个线程来执行代码
  3. 根据字节码指令,按顺序先压入虚拟机栈的操作数栈,然后再放入本地变量表,遇到方法后,又从本地变量表取出值去执行方法后,又压入操作数栈里面去。
  4. 这个时候如果有新方法进来,jvm会创建一个新的操作数栈,又执行上述逻辑,

java基础--->java运行原理

 

编译命令

javac xxxx.java

javap -v xxxx.class >xxxx.text