Java虚拟机(一)

欢迎来到我的JVM世界

JVM整体架构

在这里插入图片描述
计算机在底层运行的都是0101的代码,但是不同的操作系统,不同的硬件组成架构,对于同一个程序,运行的0101代码不一定一致。
JVM用途:实现Java代码一次编写,到处运行。

JVM虚拟机

内存模型

在这里插入图片描述
1.堆:new出来的对象放在堆里
2.栈(线程):放线程在运行过程中局部变量(先进后出)
一个方法对应一块栈帧(栈的基础组成机构)内存区域
组成部分:

  • ①局部变量表
  • ②操作数栈(遇到四则运算先弹出栈顶元素,最后将结果压入栈顶)
  • ③动态链接
  • ④方法出口:调用栈帧时对应的程序计数器的值(返回的地址)
    Javap -c:反汇编成字节码文件
int a=1;
//底层代码
iconst_1//将int类型常量1压入操作数栈
istore_1//将int类型的值存入局部变量1中
iload_1//从局部变量1中装载int类型值

注:下标为0的局部变量值为this

Math math=new Math();
//math是new出来的,应该放在堆里。对应的局部变量表中存放的是对象在堆内存里面对应的值

栈里边有无数的对象类型的局部变量,有一系列的指针指向该对象在在堆里边的值
3.本地方法栈:本地方法在执行过程中需要的内存空间
private native void start();
native :底层是C语言实现的
4.方法区:直接内存(常量+静态变量+类元信息)
静态变量如果是对象类型的,方法区存的是对象在堆里边的值(从方法区指向堆)
对象的组成部分:示例数据+对象头(标记字段:自身运行时的数据+类型指针:类的元数据指针+数组长度:只有数组对象才有)

Math math2=new Math();

堆里边的对象在对象头里边都有一个指针指向对应的类的指针(从堆指向方法区)
5.程序计数器:记录线程即将执行的对应的代码的行数/位置/地址(每个线程都是独享的)
字节码执行引请动态更改

在这里插入图片描述
new的对象放在堆的Eden里,Eden里一旦放满了之后,JVM会minor GC(垃圾收集),执行引擎开辟一个垃圾收集线程,将无效的垃圾对象(没有被引用的·)回收掉。对于有引用的存活,在一次GC过程中存活的对象会移到From中(对象的分代年龄+1)。第二次会将Eden和From中存活的对象都移动到To区域里去(对象的分代年龄+1),第三次Eden里的对象满了,触发minor GC,会将To和Eden区域里存活下来的对象移动到From区域中,以此类推。
对象年龄一旦达到15,就会将这种对象挪动到老年代中。例:静态变量对象类型,配置缓存信息,线程池化的对象(一直有引用引用的对象)
老年代一旦放满:垃圾收集线程会触发full GC(整个对堆空间进行整体的垃圾回收),
STW:停止应用程序的所有线程,让字节码执行引擎开启垃圾收集线程专门对堆里面的所有对象进行垃圾回收。
所有程序一旦被停止掉,意味着用户就没有办法访问系统,线程在垃圾回收的过程中,应用程序的线程就会被停止,用户在访问的过程中就会停止下来,就涉及到了JVM调优

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值