首页 > 其他 > 详细

深入理解HelloWorld

时间:2020-03-14 10:05:45      阅读:79      评论:0      收藏:0      [点我收藏+]

         Hello World几乎是是每一门编程语言的第一个节课  现在到已然成为一种传统

        JAVA把C和C++的复杂语法以及容易造成编程错误的指针手动释放内存等弊端给屏蔽了  C和C++是直接和操作系统直接交互  会造成忘记释放内存的错误  JAVA则依赖于JVM(Java Virtual Machine <Java虚拟机>)管理  JAVA通过JVM和操作系统打交道   出错JVM会报异常error  还有垃圾回收器等 能够自动帮你释放内存  还解决了跨平台问题

         我们写好Hello World后  通过调用JDK的工具后   编译成了.class文件  此时会在内存中划分一段空间  创建一个JVM  通过类加载器校验class文件是否符合JVM的规范  JVM在对Java类解释执行

调用JDK的工具javac变成class文件这一步与JVM无关
编译 即把我们写好的java文件 通过javac命令编译成字节码 也就是我们常说的.class文件
运行 则是把编译生成的.class文件交给JVM执行
1 public class Hello{
2         public static  void main(String[] args){4              System.out.printf("Hello");
5   }
6 }
JVM在将类字节码读入到内存中后 会找到加载类中的主类 在主类中找到main方法之后在执行main方法然后输出Hello
为了JVM的安全性class文件在加载时在类加载器中会经历这么几个步骤
技术分享图片

 

 Java类从被虚拟机加载开始 到卸载出内存为止 它的整个生命周期包括 加载(Loading) 验证(Verification) 准备(Preparation) 解析(Resolution) 初始化(Initialization) 使用(Using)和卸载(Unloading)7个阶段 其中验证 准备和解析又统称为连接(Linking)阶段

加载 将class文件加载到内存中

验证 两点 验证当前class文件的是否兼容当前JVM的版本 验证class文件是否符合JVM规范(JVM规定class的第一个字节码必须有一个十六进制的魔数值)

准备 将类成员初始化为初始值 final变量直接初始化为变量值

解析 将符号引用解析为直接引用(直接引用即为内存地址 如 0x000000001)

初始化 把定义的static变量或者static代码块按顺序组织成(clinit)构造器也成为类成员构造器来初始化变量

卸载 当该类的class对象不再被引用之后 该类的生命周期也就结束了 之后 该类会被类加载器卸载

Hello.java通过javac变成Hello.class文件变成java文件后经过类加载器的几个阶段 就会把信息放在jvm的方法区里面 关于所有类的信息通过常量池都会保存在方法区 生成了一个代表所有类信息的变量classInstance 变成字节码文件后 方法区里面就有它的信息 然后执行main方法就会把它压到线程栈里面 把system类加载到方法区里 system有个.out的静态对象 调用out对象的实例方法println输出hello 然后输出hello

 技术分享图片

javap -c 将字节码反编译为字节码指令输出
getstatic取得静态属性方法 system会加载到方法区在常量池保存着 从系统类中拿到一个属性out 压到栈底 #2是代表着2号常量池 从syteam的2号常量池(方法区中是一个个的常量池 每个类都有它的常量池) 在拿到string调用out方法的plintln 最后return

深入理解HelloWorld

原文:https://www.cnblogs.com/daomeidan/p/12490407.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!