1, Java 文件是怎么运行的
- 编译java 成 class文件
- 执行带有主方法的class文件
- 找到jvm.cfg, jvm配置文件, 里面配置了JVM.DLL的C++, JVM实现
- 类加载器开始加载类进入JVM
- 找到主类然后运行
2, JVM 数据模型
- 栈: 栈是每个线程私有的, 由很多个栈帧组成 , 可以看到栈1,栈2, 栈3, 栈是有深度和空间大小的, 死循环就会导致栈的深度错误StackOverflowError 栈深错误 和 OutofMemoryError 栈溢出错误, 每调用一个函数都会产生一个栈帧, 栈帧存储, 函数的输入参数, 局部变量, 返回参数
- 堆:
- 新生代(PSYoungGen), 又分为eden 伊甸园, form 和 to 幸存区(Survivor), f 和 t 之间会来回切换, 空的就是to, 专门设计给复制清除GC 算法的,判断变量是否由引入, 有就复制到to, 没有就留下, 然后删除form 的空间, to 编程form, form 变成 to, 以形换位大法
-
老年代(ParOldGen), 当一个对象在form 和 to 之间转了很多次的时候, 这个对象将被移送到老年代, 老年代的GC扫描会相比新生代会减少频率, 在JVM中, 最多15次新生代GC后还活着的, 它必然将转移到老年区
-
元数据, 存放类信息, 方法, 代码, 常量, 静态变量, 这块内存使用的是本地内存, 和主机内存相关
3. 本地方法栈, 调用本地方法接口时的执行栈帧和Java 栈是相似的
4. PC 寄存器, 存储一下条指令的位置, 可以理解未一下行代码的行数