JVM详解

详细的文章在这里:
点我

一 java代码运行的流程

1.1编译

java代码运行前需要先编译:
编译:java源代码—javac—class文件

1.2jvm

编译后class文件不能直接运行。需要jvm才能运行
(jvm是凌驾于操作系统之上的,不同的操作系统有不同的指令,只需保证安装jdk的时候指明一下系统就可以实现一次编译,到处运行)

1.2.1class文件是什么时候加载到jvm上的

一般编译后的class不会直接加载到jvm上,但是一下5种情况编译后的class会直接加载到jvm上
1.创建类的实例(new 的方式)。访问某个类或接口的静态变量,或者对该静态变量赋值,调用类的静态方法
2.反射的方式
3.初始化某个类的子类,则其父类也会被初始化
4.Java虚拟机启动时被标明为启动类的类,直接使用java.exe命令来运行某个主类(包含main方法的那个类)
5.当使用JDK1.7的动态语言支持时(…)
所以说 Java类的加载是动态的,它并不会一次性将所有类全部加载后再运行,而是保证程序运行的基础类(像是基类)完全加载到jvm中,至于其他类,则在需要的时候才加载。这当然就是为了节省内存开销。

1.2.2class文件是如何加载到jvm上的

class文件是通过类的加载器装载到jvm中的!

1.3加载到jvm后 jvm又要做什么

在类加载检查通过后,接下来虚拟机将为新生对象分配内存。

1.3.1jvm的内存结构

在这里插入图片描述

1.堆:存放对象实例,几乎所有的对象实例都在这里分配内存
2.虚拟机栈(栈):虚拟机栈描述的是Java方法执行的内存结构:每个方法被执行的时候都会同时创建一个栈帧(Stack Frame)用于存储局部变量表、操作栈、动态链接、方法出口等信息 (比如返回值,局部变量表和各种对象引用等)栈 栈帧 线程工作内存
3.本地方法栈:本地方法栈则是为虚拟机使用到的Native方法服务。
4.方法区:所有线程共享的区域,存储已经被虚拟机加载的类信息、常量、静态变量
对于Java8, HotSpots取消了永久代,那么是不是也就没有方法区了呢?当然不是,方法区是一个规范,规范没变,它就一直在。那么取代永久代的就是元空间。它可永久代有什么不同的?存储位置不同,永久代属于jvm虚拟机内存,而元空间属于本地内存;存储内容不同,元空间存储类的元信息,静态变量和常量池等并入堆中。相当于永久代的数据被分到了堆和元空间中。(可以理解1.8以后为永久代的静态变量和常量池被分到了堆中,然后永久代消失,取而代之的是元空间,元空间存储的是永久代除了静态变量和常量池剩余的数据(元空间主要存储的是类型信息)
在这里插入图片描述

5.程序计数器:当前线程所执行的字节码的行号指示器

1.4 例子
public class test{
    public static void main(String arg[]{
      Java3y java3y = ren Java3y()
      java3y.setName(15)
}
 }

1、通过java.exe运行Test.class,随后被加载到JVM中(自动加载到jvm中),元空间存储着类的信息(包括类的名称、方法信息、字段信息…)。
2、然后JVM找到Java3yTest的主函数入口(main),为main函数创建栈帧,开始执行main函数
3、main函数的第一条命令是Java3y java3y = new Java3y();就是让JVM创建一个Java3y对象,但是这时候方法区中没有Java3y类的信息,所以JVM马上加载Java3y类,把Java3y类的类型信息放到方法区中(元空间)
4、加载完Java3y类之后,Java虚拟机做的第一件事情就是在堆区中为一个新的Java3y实例分配内存, 然后调用构造函数初始化Java3y实例,这个Java3y实例持有着指向方法区的Java3y类的类型信息(其中包含有方法表,java动态绑定的底层实现)的引用
5、当使用java3y.setName(“Java3y”);的时候,JVM根据java3y引用找到Java3y对象,然后根据Java3y对象持有的引用定位到方法区中Java3y类的类型信息的方法表,获得setName()函数的字节码的地址
6、为setName()函数创建栈帧,开始运行setName()函数(先创建在运行)

2常见的面试题

1、详细jvm内存结构
2、讲讲什么情况下回出现内存溢出,内存泄漏?
3、说说Java线程栈
4、JVM 年轻代到年老代的晋升过程的判断条件是什么呢?
5、JVM 出现 fullGC 很频繁,怎么去线上排查问题?
6、类加载为什么要使用双亲委派模式,有没有什么场景是打破了这个模式?
7、类的实例化顺序
8、JVM垃圾回收机制,何时触发MinorGC等操作
9、JVM 中一次完整的 GC 流程(从 ygc 到 fgc)是怎样的
10、各种回收器,各自优缺点,重点CMS、G1
11、各种回收算法
12、OOM错误,stackoverflow错误,permgen space错误

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值