class 编译流程
先通过javac装载进子系统,然后加入运行时数据区,最后通过字节码执行引擎执行
运行时数据区包含什么
运行时数据区包含,堆,栈,本地方法区,方法区(元空间),程序计数器
栈帧中存放的是什么
栈帧是栈中的一小块空间
栈帧中存放的是操作数栈,局部变量表,动态链接,方法出口
操作数栈:是一个临时变量的存放空间
局部变量表,存放的是代码中的局部变量
动态链接: 把符号引用转换为直接引用,里面包含了c,C++的实现,java虚拟机可以根据符号引用转到实际的地址
方法出口:根据方法出口的信息,方法的返回值,怎么继续执行
注意:Main方法中的局部变量表存放法的是对象中的地址
什么是程序计数器
Java中的每一个线程都会有一个程序计数器,用于存放当前线程所执行到的代码,用于线程切换
为什么会有程序计数器
因为java是多线程的,程序计数器,用于记录当前线程执行到的代码位置 ,当被其他优先级更高的线程获取到了时间片,本线程就会暂停,直到再次拿到cpu的时间片,如果没有程序计数器,就会出现不知道执行到哪一行的情况,如果重新执行可能出现意想不到的错误,所以有了程序计数器
程序计数器是如何修改的
程序技术器是通过才执行引擎修改的
方法区中包含什么(1.8之后叫做元空间)
方法区中存放的是常量,静态变量,类信息
什么是本地方法栈
用navtive修饰的方法是本地方法,是用C,C++写的,java调用时内存空间就会放在本地方法区
哪些内存空间是私有的,哪些是共享的
堆和方法区是线程共享的
栈,程序计数器,本地方法栈是线程私有的
JAVA中为什么会有STW(Stop-The-World)机制,能够不使用吗?
如果不设计STW会出现前一秒这个对象是非垃圾.可是后一秒就成为了垃圾,系统会很难设计;
什么是新生代什么是老年代
新生代和老年代都是存放在堆中的,其中数据是共享的,字节码引擎会有一个垃圾回收线程(minor-GC),会专门针对新生代做垃圾回收,当进行一次垃圾回收后,没有被回收的对象,它的分代年龄就会加1 当分代年龄大于等于15时就会放入老年代.
minor-GC 他只会回收新生代
fullGC 会回收老年代
新生代中包含哪些
新生代分为Eden区 S0 S1区 当一个对象经历一次垃圾回收分代年龄就加1,当分代年龄大于等于15就会移入老年代
垃圾回收算法有哪些
垃圾回收算法有引用计数器,可达性分析