仅仅是打印一个HelloWorld吗? 虚拟机执行HelloWorld.java的时候都干了什么?

你以为的HelloWorld


public class HelloWorld
{
	//Java应用程序入口方法
	  public static void main(String[] args)
	 {   String s;
	       s="Hello World!";
		 //向控制台打印一条信息
 	   System.out.println("s="+s);
	 }	
}

//输出结果
s=HelloWorld!

实际上的HelloWorldHelloWorld内存图

对象有5个: s,三个流对象,常对象hello World
方法3个:main(),println,toString()
变量两个:args ,s
类4个:Helloworld.class  System.class  String[].class  String.class 

java虚拟机执行的操作

首先jvm都是从主方法开始着手的,所以我们一条一条的看主方法

1.加载主类 HelloWorld.class,在方法区的类代码区
2.进入主方法main(),并将主方法压栈,这块内存实际上在主线程的主方法栈帧中
并加载String[] .class到方法区的类代码区
3.为主类的属性和方法开辟空间:
主类没有属性,但有方法:主方法mian(),并为其在方法区的共享代码区开辟空间,且在堆区保留该方法的引用.

4.
String s;    
//此时在方法区的类代码区加载String.class
//并且在堆区为String类型的变量开辟对应大小的空间,且默认值为null
5.
s="HelloWorld !";
//此时会在方法区的常量池中创建一个String类型的对象 为"HelloWrorld !"
//并将此内存的地址指向s
6..
System.out.println("s="+s);
//加载System.class到方法区的类代码区
//在堆区创建三个流对象 标准字节输入流对象System.in ;标准字节输出流对象System.out ;标准字节出错流对象System.error ;
//调用了println()方法,在方法区的共享代码区加载println()
//调用了toString()方法,同样在方法区的共享代码区加载toString();

综上所述

五个对象: 堆区的 s, 三个流对象:System.in,System.out ,System.error ,方法区的常量池中的常类对象"“HelloWorld !” ;
三个方法: main();println();toString();
两个变量: args(形参), String s;
四个类: HelloWorld.class ; String.class; toString.class ; System.class
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值