JVM知识点
前言
java源码-----> 编译成二进制字节码 -----> 解释器 解释成机器码(每次从程序计数器中取出需要执行的字节码)----> 然后交给cpu运行,
是java提供的 jps (java process status )查看java 的进程状态
jps -q 只能看到进程PID
jps -l 输出应用程序main class的完整package名或者应用程序的jar文件完整路径名
jps -v 虚拟机启动制定的jvm参数
二、jvm内存模型
1、栈:什么是栈?(线程私有)
每个线程运行时所需要的的内存,用来存放线程的放局部变量空间,每一个线程 分配一块儿,内存地址,
特点:数据结构特点 先进后出, ,-Xss 1024k 设置栈大小,
栈中主要存放一些基本类型的变量(int, short, long, byte, float, double, boolean, char)
栈内存溢出:Exception in thread “main” java.lang.StackOverflowError
2、栈帧?
栈里面给每个方法 ,分配栈帧,用来存放局部变量 FILO 先进后出
3、活动栈帧 ? 当前运行的栈帧称之为活动栈帧
javap -c AbstractActivity.class > ll.txt 反编译查看字节码
4、程序计数器 ?(线程私有)
程序计数器是用于存放下一条指令所在单元的地址的地方 ,再物理上的位置是 (寄存器)
特点:线程私有、不会内存溢出
5、方法区? (线程共享)
用于存储已经被虚拟机加载的类信息,常量,静态变量等。
这个区域的内存回收目标主要针对常量池的回收和堆类型的卸载
6、什么是堆?(线程共享)
被所有线程共享的一块内存区域,在虚拟机启动的时候创建,用于存放对象实例。
就是 使用new 创建的对象都会使用堆内存
调优:-Xmx 8m
特点 :有垃圾回收机制 线程共享、需要考虑线程安全问题
内存溢出: Exception in thread “main” java.lang.OutOfMemoryError: Java heap space
7、 运行时常量池?
属于方法区一部分,用于存放编译期生成的各种字面量和符号引用。编译器和运行期(String 的 intern() )都可以将常量放入池中。内存有限,无法申请时抛出 OutOfMemoryError。
7、栈、压栈动演示
二、 栈的常见问题辩悉
1:垃圾回收是否涉及栈内存 ?
答:垃圾回收不涉及栈内存,每次执行完就释放了
2:栈内存的分配越大越好吗?
答:-Xss linux、macOs、等 默认1024Kb = 1M 。 windos特殊些
3:方法内的局部变量是否线程安全?
答:是否多个线程 在使用, 方法内的局部变量 没有否逃离方法的作用范围。他是线程安全的
4:栈的内存溢出 原因?
1、栈的大小是固定的 ,栈帧过多。(递归典型例子)
2、栈的大小过大
public class Demo03Test {
/**
* public static boolean flag = false;
* 打印:
* ==============start
* ==============end
* volatile 用volatile修饰的变量,线程在每次使用变量的时候,都会读取变量修改后的最的值
*/
public static volatile boolean flag = false;
public static void main(String[] args) {
new Thread(() -> {
while (!flag) {
}
System.out.println("==========success");
}).start();
try {
Thread.sleep(2000);
changeFlag();
} catch (Exception e) {
}
}
public static void changeFlag() {
System.out.println("==============start");
flag = true;
System.out.println("==============end");
}
}
console:
==============start
==============end
==========success
三、jvm调优
四、分销会员登录流程图
五、String 面试题
六、jvm常用参数 以及区域大小
1、-Xms设置堆的最小空间大小。-Xmx设置堆的最大空间大小。-XX:NewSize设置新生代最小空间大小。-XX:MaxNewSize设置新生代最大空间大小。
2、-XX:PermSize 设置最小空间 -XX:MaxPermSize 设置最大空间。
3、-Xss控制每个线程栈的大小。
老年代:2/3的堆空间
年轻代:1/3的堆空间
eden区:8/10 的年轻代
survivor0: 1/10 的年轻代
survivor1:1/10的年轻代
七、垃圾回收器 完全不懂