讲诉JVM
????????jvm是Java代码运行的环境,他将java程序翻译成为机器可以可以识别的机器码,可以跨平台运行如linuc或者windos
简单说一下我对jvm运行的理解,
????????首先我们运行程序的时候,类加载器会将类按需加载到元空间/方法区里面
????????然后启动线程的时候,jvm就会给每个线程分配一个独立的栈,如果有native方法就会有一个本地方法栈,对应的每个线程会有一个 程序计数器 用于记录线程运行状态的,线程运行到每一个方法就会有一个栈帧,方法执行完, 栈帧就会被释放,后进先出,当线程运行完成,栈也就释放了
? ? ? ? 在线程运行过程中,所新建和操作的一下临时对象就就会在堆中创建然后被引用,当线程执行完成,没有引用的对象,在下一次垃圾回收执行的时候被清理。大体流程就是这样
????????类的加载触发:是按需要加载的,当被new到,静态方法或静态成员被访问到,反射操作等就会触发类的加载,? ? ? ?
????????类的加载过程:加载,连接,初始化,使用,销毁
? ? ? ?加载阶段:工具类名将类的字节码通过文件、网络等方式读取到内存中,然后解析加载到方法区/元空间中。
? ? ? ? 加载阶段完成之后就到连接
? ? ? ? 连接分为3个步骤,首先是验证,验证字节码结构,语义是否复java约束规范 例如开头是否?cafe babe,验证通过就到准备阶段,给静态变量分配内存,给初始值,常量赋值等
最后是解析阶段,将符合引用替换为直接引用,解析为直接内存地址,链接阶段就算完成了
? ? ? ? 最后就是初始化了 ,静态变量初始值,执行静态快
? ? ? ? 初始化完成就是可以使用了,还有就是就是销毁,虽然这个销毁很少发生 在内存不足full GC的时候 还是有可能被销毁的
????????类加载过程是按双亲委派模型的
? ? ? ? 因为类的加载器有 启动类加载器,扩展类加载器,应用类加载器,每个加载器各自负责加载不通的类,启动类加载java运行时环境所需的类? ?如string所在的lang包,list,map所在的util包,IO包等,扩展类加载器就是加载bin/ext目录下的第三方库。应用类加载器就是加载我们写的类的,所谓的双亲委派就是 一个类的加载器收到请求,会先去尝试让父类加载,向上委派,如果父类加载过就不需要再加载,例如应用类加载器收到请求 会委派给扩展类加载器,扩展类加载器又委派给启动类加载器,这样做的好处就是确保安全,避免核心类被加载,避免重复加载保证唯一。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!