1、main方法说起

编译完我们的java文件后,需要有个一含有main方法的类,java 命令将指示操作系统启动一个jvm进程

这个jvm进程启动后,寻找那个main地方开始执行程序

java [JVM_Options] ClassName_with_main [args_separate_space]

main方法的签名必须是 pubic static void main(String[] args) why?

简单点:

首先,main方法是JVM(java虚拟机)自动调用

JVM调用main方法的位置自然不会在某个类中、或某个包中,因此只有当main方法在公有级别上时,才对JVM可见,所以mian方法需要public修饰,

main方法所在的类也需要public修饰符。

由于main方法是所有程序的入口,也就是main被调用时没有任何对象创建,不通过对象调用某一方法,只有将该方法定义为静态方法,所以main方法是一个静态方法,既需要static修饰。

JVM对于java程序已经是最底层,由它调用的方法的返回值已经没有任何地方可去,因此,main方法返回值为空,既需用void修饰。

至于main方法的参数String[ ] arg我们现在已经很少有机会去用它了,它用于在接受命令行传入的参数

2、执行main方法之前发生了神马

可以参看 jvm源码分析

首先要明确 jvm进程 是操作系统的进程,该进程是多线程机制的

我们明确两种线程:

jvm线程:指jvm自行管理的线程,我们在程序中无法操控,多是守护类型的

java线程:指从java技术角度看 jvm、我们在程序中用Thread类或Runnable接口编写产生的线程,可操控的线程

至于 java线程 在 jvm里面是怎么实现的,怎么对应到os级别的线程的,请看  http://my.oschina.net/jingxing05/blog/275334

明确两类不同的线程之后,执行main方法之前: LoadJavaVM

jvm进程启动了多个jvm线程(很可能是错的,如有,请赐教):

jvm线程:

  • 启动 VM Thread, 单例的,所有线程之始祖!这个线程自轮询loop从对一个队列中取操作任务,来产生其他线程

  • 根据jvm抽象规范,可能有执行引擎线程,GC线程,classloader线程

在jvm自身启动和初始化之后,会

ContinueInNewThread(JavaMain, threadStackSize, (void*)&args);

即启动一个叫main的线程来执行  入口的main方法,main线程虽然不是我们手动生出的线程,但ta还是一个非守护线程

3、main执行过程

  • 加载类

执行main方法时,jvm进程发现main所在类没有在方法区,于是开始进行classload

类加载完的最后一步是 根据情况决定  是不是要进行类的初始化

在main执行之前,必须先对类进行初始化。初始化类的变量,还有静态代码块。初始化的时候还要先初始化它的父类。每个类都有一个隐含的父类Object。

初始化的顺序:类变量和静态块按序,先父后子

类的初始化过程发生时刻:

1. T是一个类,当T的一个实例创建的时候,也就是T t = new T();

2. T的一个静态方法被调用的时候,也就是 T.staticField();

3. T的静态属性被赋值的时候,T.staticField = o;

4. T的一个静态属性被使用的时候,也就是 Object o = T.staticField; 但是它不是常量。

5. T is a top level class , and an assert statement  lexically nested

within T  is executed. (不懂,求解)

  • 执行main方法

将方法需要的参数,局部变量,本地方法,操作数等以 栈帧的结构 push到 main线程的堆栈区,然后执行引擎线程开始执行,执行完毕,将该栈帧 pop掉。main线程的堆栈区没有栈帧时,main线程消退。

  • 卸载类对象

这一步是个优化的步骤,释放一些方法区的内存,jvm自己决定要不要这一步,一般不会去卸载方法区的

  • 程序退出

1. 所有的非daemon线程都终止了

2. 某个线程调用了类Runtime或者System的exit方法

main程序执行图

类加载详细过程

Java main 方法详解相关推荐

  1. Java中的main()方法详解

    源文作者:leizhimin    源文链接:http://lavasoft.blog.51cto.com/62575/53263 源文作者版权申明: 版权声明:原创作品,允许转载,转载时请务必以超链 ...

  2. java中main是什么_Java中的main()方法详解

    在Java中,main()方法是Java应用程序的入口方法,也就是说,程序在运行的时候,第一个执行的方法就是main()方法,这个方法和其他的方法有很大的不同,比如方法的名字必须是main,方法必须是 ...

  3. JavaSE——面向对象进阶(封装、this、static、代码块、包、权限修饰符、main方法详解)

    第2节 面向对象进阶 一.封装与private 概述: 封装的意义在于保护或者防止代码(数据)被我们无意中破坏.保护成员属性,不让类以外的程序直接访问和修改. 封装原则: 隐藏对象的属性和实现细节,仅 ...

  4. java函数方法详解(简单易懂)

    方法(函数) 函数的组成是: 访问修饰符 返回值 函数名(形式参数) {函数内容; } 更多java函数方法详解视频课程学习地址:https://ke.qq.com/course/149432  有技 ...

  5. java equals方法详解

    序言:准备总结一些java基础的知识方便以后查阅,从equals入手 目录: 等于(==)详解 equals方法详解 一.等于(==)详解 先明确一点:"==" 其实是存储地址的比 ...

  6. JAVA 静态变量,静态方法,main方法详解(韩顺平)

    目录 一.类变量 1.类变量的引入 2.类变量的定义 3.类变量的特点 4.如何定义类变量 5.如何访问类变量 6.类变量使用细节 二.类方法 1.基本介绍 2.定义类方法 3.类方法的访问 4.类方 ...

  7. 5、main方法详解

    public class HelloWorld {public static void main(String[] args){System.out.print("Hello World!& ...

  8. JAVA toString方法详解

    JAVA toString方法 在Java中,我们经常会编写许多自定义类.在使用时,我们如何打印出这些类中实例变量? class value {private int s;public void se ...

  9. java clone() 方法详解及深克隆与浅克隆

    概述 clone 翻译过来就是 克隆,顾名思义就是创造一个一模一样的事物.Java 代码中 clone() 方法是 Object 方法,而 Object 又是所有类的父类,也就是说所有 java 对象 ...

最新文章

  1. linux进程池动态维护,可直接商用的跨平台c,c++动态线程池,任务池stpool库
  2. 程序员:我不学Python了!!
  3. 什么是上采样和下采样
  4. undo表空间文件丢失恢复(3)--无备份无redo的情况下恢复
  5. HTML5 视频播放器 WordPress插件
  6. 两位小数乘两位小数竖式_人教版小学数学五年级上册小数乘整数公开课优质课课件教案视频...
  7. linux内存管理(二)-内存数据结构分析
  8. RAID简单介绍和Linux如何搭建一个RAID
  9. Ubuntu Desktop安装及桌面美化(修复图片)
  10. 对JSP内置对象的部分总结
  11. 在哪儿比较好下载建筑学西方近现代的外文文献?
  12. 数据库系统概念4中级SQL
  13. 现代网页的灵魂 —— JavaScript
  14. 开发随笔——花生壳错误“您的局域网服务器连接失败,请检查局域网IP与端口“
  15. ASBR上配置外部OSPF路由汇总
  16. Flutter Web 支持现已进入稳定版
  17. 【开源教程13】疯壳·开源编队无人机-SPI(六轴传感器数据获取)
  18. linux svn e170001 认证失败,jenkins - svn: E170001报错的原因以及解决方案
  19. CentOS升级或安装安装JDK 8
  20. 计算机类博士阶段学术规划,计算机博士生职业生涯规划咨询

热门文章

  1. 中国电子协会考评中心_中国电子学会考评中心和CPA青少年编程能力等级测评有什么不同?...
  2. 便携式计算机推销洽谈方案,推销洽谈的方法
  3. h5 右下角浮动按钮_意派Epub360丨国庆黄金周将至,分享9个H5互动营销思路
  4. 七、Forword(请求转发)与Redirect(重定向)
  5. loadrunner自学笔记-性能测试的注意要点
  6. Zookeeper C 同步 API 介绍
  7. golang 切片slice使用总结(动态数组、cap与len区别)
  8. python requests 提示警告 InsecureRequestWarning
  9. CentOS7 下安装 Redis
  10. python实现汉诺塔程序