HelloWorld.java源码如下:
public class HelloWorld {
public static void main(String[] args) {
String s ;
s = "HelloHorld";
System.out.println("s = " + s);
}
}
画图分析:
1. jvm 内存分布图
概括:1文件 Helloworld.java
4.class String[].class
String.class
Helloworld.class
System.class
3方法 toString()
println();
main();
2变量 args s
2.jvm 工作流程
首先自然是将源码进行编译啦!生成HelloWorld.class的字节码文件。
当输入java HelloWorld的命令运行java程序时,系统收到指令,就会创建java虚拟机线程,这个进程开始从classpath中找到HelloWorld.class文件,读取这个文件中的二进制数据,然后把HelloWorld类的类信息存放到方法区的类代码区中。这一过程称为类的加载过程。
之后JVM主线程会去找main()这个主方法,开始执行方法里面的指令。main()方法中形参args是字符串数组类型的,因为String[]也是一个对象,所以在堆中开辟属于它的内存空间。可以通过键盘输入参数传递给args这个形参,保存在String[]的内存空间中。
第一条指令String s;由于这个变量是在main()方法里面,它是一个局部变量,所以jvm就为它栈中开辟了一块空间。
s = ”HelloWorld”中, ”HelloWorld”是常对象,在方法区的数据区的常量数据区开辟内存空间,开辟好空间后将这块空间的地址付给了变量s,所以变量s存放的是地址,而不是”HelloWorld”这个字符串。
System.out.println(“s= ” + s)中,因为System是java标准类库中的类,位于java,lang下,这个包是在java程序启动时候,JVM的classLoder就会直接将它加载进来的,所以不需要人工手动导入就可以直接使用,这个System类在堆中开辟了三块地址空间,分别属于System.in,System.out,System.error。System.out.println()复写了objecttoString()方法,得到返回来的s所指向地址的值,然后向控制台输出,最后换行。
输出结果:s = Hello Horld!
ps:解释一下 main方法
public static void main(String[] args)
static :意味着主函数随着类加载就存在了 (通过类查找)
(String[] args):主函数的参数 args 参数类型 为字符串数组对象
个人学习心得,欢迎批评指正 by-publicmain