Helloworld 在jvm 内存图

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

 

      

原文地址:https://www.cnblogs.com/publicmain/p/6919255.html