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的年轻代
在这里插入图片描述

七、垃圾回收器 完全不懂

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值