1. 什么是JVM?
- Java Virtual Machine, Java程序运行环境(Java二进制字节码的运行环境)
- 好处
- 一次编写,到处运行
- 自动内存管理,垃圾回收功能
- 数组下标越界检查
- 多态(虚方法表实现)
2. Program Counter Register 程序计数器(寄存器)
- 作用:记住 下一条jvm指令的执行地址
- 特点:
- 是线程私有的,随着线程创建而创建,随线程销毁而销毁0
- 不会存在内存溢出
3. Java Virtual Stacks (Java虚拟机栈)
- 每个线程运行时所需的内存,称为虚拟机栈
- 每个栈由多个栈帧(Frame)组成,对应着每次方法调用时所占用的内存
- 每个线程只能有一个活动栈帧,对应着当前正在执行的那个方法
4. 垃圾回收是否涉及栈内存?
- 不会。栈帧内存 在每次方法调用结束后会自动弹出栈(自动回收),不需要回收(垃圾回收回收堆内存中无用对象,不会回收栈内存)
5. 栈内存分配越大越好吗?
- 不是。栈内存大了,通常可进行更多次方法调用,并不会提高效率,反而会使线程数目变少
6. 方法内的局部变量是否是线程安全的?
- 如果方法内局部变量没有逃离方法的作用范围,它是线程安全的
- 如果是局部变量引用了对象,并逃离方法的作用方法,需要考虑线程安全
static void m1(){
int x = 0;
for(int i = 0; i < 500; i++){
x++;
}
System.out.println(x);
}
package JVM;
public class Demo01 {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder();
sb.append(4);
sb.append(5);
sb.append(6);
}
public static void m1() {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(1);
stringBuilder.append(2);
stringBuilder.append(3);
System.out.println(stringBuilder.toString());
}
public static void m2(StringBuilder stringBuilder) {
stringBuilder.append(1);
stringBuilder.append(2);
stringBuilder.append(3);
System.out.println(stringBuilder.toString());
}
public static StringBuilder m2() {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(1);
stringBuilder.append(2);
stringBuilder.append(3);
return stringBuilder;
}
}
7. 栈内存溢出(StackOverflow)
- 栈帧过多导致栈内存溢出(如递归未设置终止条件)
- 栈帧过大导致栈内存溢出