- Java 虚拟机规范中说明:所有的对象实例(all class instances)以及数组都要在堆上分配;
- the heap is the runtime data area from which memory for all class instances and arrays is allocated.
0. 访问修饰符,static,栈内存
Java Error - Illegal Modifier for Parameter - Only final Permitted
- 函数内的局部变量仅存在于栈内存上;
- 局部变量不可用 public/private/protected、static 等词修饰;
- 最多使用 final(only final permitted);
- 栈内存上(局部对象)无所谓访问权限的概念;也即不可用 public/private/protected 等修饰符修饰函数内的局部变量;
- static 修饰成员说明,所有类实例中仅存在一份;
- 创建这些被 static 修饰的成员不需要类的实例化;
- 因为栈上的对象都是 temporary 临时的,栈上对象也就无所谓 static 这一含义了;
1. JVM
从 .java 到 .class(字节码文件) 是 javac (java compiler)的工作,JVM 工作在 .class 文件在各个操作系统的平台上:
- Interpreter for Mac/Windows/Linux,表示的是各操作系统平台上的字节码解释器(.class interpreter)
- javac 使得 .java 文件(本地机器码)转变为字节码(.class)
2. java 运行时系统(Runtime System)
/
- PC register:program counter register,程序计数器,只占据一块很小的内存空间,可将其看做是当前线程所执行的字节码(.class)的行号指示器。
- 在虚拟机的概念模型里,字节码解释器(.class interpreter)工作时便是通过改变这个程序技术器的值来选择下一条要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成;
- 在多线程环境下,java 虚拟机是通过线程轮流切换以及分配处理器执行时间的方式来实现(也即在任何一个确定时刻,一个处理器(多核处理器的一个内核)都只会执行一条线程中的指令),因此为了线程切换后能够恢复到正确的执行位置,每个线程都需要一个独立的程序计数器(program counter register),各条线程之间计数器互不影响,独立存储,称这类内存区域为“线程私有”的内存;
- 执行引擎(execute engine)是 java 虚拟机最核心的组成成分。虚拟机是相对物理机而存在的,这两种执行器都有代码执行能力,其区别是物理机的执行引擎直接建立在处理器、硬件、指令集和操作系统层面,而虚拟机的执行引擎都是由自己实现的,因此可以自行制定指令集和执行引擎的结构体系,并且能够执行那些不被硬件直接支持的指令集格式;