JVM 的理解
jvm 是由 类加载子系统 、 java堆 、 方法区 、 java栈 、 内存 、 pc寄存器 、 本地方法栈 、 垃圾回收系统 、 执行引擎 。
- 类的加载:
- 放的是系统或者是网络中加载的class信息,类加载的信息存在在地方叫方法区的内存空间, 除了类的信息外, 还放着有运行时的常量信息。
- java中的堆:
- 是放java对象的实例,堆空间是所有线程共享的,垃圾回收系统是java虚拟机的重要组成部分,垃圾回收器可以对,方法区、java堆、直接内存进行回收 ,也就是说可以对,线程共享的区域进行内存回收。
- Java中的栈:
- 每一个java虚拟机线程都有一个私有的java栈,一个线程的java栈在线程创建的时候被创建,java栈中保存着帧信息,java栈中保存着局部变量、方法参数,同时和java方法的调用、返回密切相关。
- String在堆和栈属于:基本类型的变量数据和对象的引用都是放在栈里面的,对象本身放在堆里面,显式的String常量放在常量池,String对象放在堆中。
- pc 寄存器:
- 指向虚拟机字节码指令的位置
- 唯一一个没有oom的区域,也就是说没有垃圾回收。(虚拟机栈和本地方法栈没有垃圾回收,但是会内存溢出。方法区和堆 是有垃圾回收,但也会内存溢出)
-
本地方法栈
- 本地方法栈和线程的生命周期一致
- 线程中的每个一方法都会创建一个对应的栈帧
- 一个栈帧包含了: 本地变量、操作数栈、 对运行时常量池的引用
- 异常: 线程请求栈的深度大于jvm的允许的深度、 若jvm 允许动态的扩展,jvm无法申请到内存。
为什么程序计数器不能共享,为什么必须是私有的原因?
虚拟机的多线程是通过线程的切换并分配处理器执行时间的方式来实现的。在一个确定的时刻。一个线程只会执行一个线程的指令, 这样的情况就会出现了某一个线程出现中断和链接的情况。这个时候如果程序计数器是共享的,就很有可能出现记录指令不准确的情况,为此。需要给指定的线程分配指定的程序计数器来完成。这样就不会出现错乱的情况。
代码在JVM会做什么:
第一步: 编译成字节码文件, 通过字节码的文件在内存从空间上编译成机器码进行解析。
jdk 1.8 递增算法 标记算法
内存中的 推 有新生代 和老年代 元空间
新生代 : 是采用的复制回收算法

浙公网安备 33010602011771号