Java main方法背后的故事?

551人阅读 评论(0) 收藏 举报
分类:

jvm java 看似一种语言,实则一个巨大的体系的王国,开发这么多年了,还是没有搞懂,我以为我懂了,可是过了一段时间又忘了,所以说还是没懂

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程序执行图


类加载详细过程



jvm中的一些线程可参看点击打开链接


原文转自:点击打开链接

查看评论

感动世界的50首歌和他们背后的故事1

题记:谨以此书献给约翰·丹佛和柯特·科本以及其他许许多多老家伙们的破吉他和旧钢琴。 ...
  • Penlee
  • Penlee
  • 2007-03-06 21:33:00
  • 6568

腾讯-1.4亿在线背后的故事

http://www.doc88.com/p-2804734638000.html
  • wlr_tang
  • wlr_tang
  • 2015-06-27 08:28:25
  • 719

巫启贤《太傻》背后的故事

他是一个喜欢巫启贤的高薪白领,   她是一个喜欢巫启贤的在读大学生。  那天他到CD店里买巫启贤的专辑《等你等到心痛》,  而她也在同一天到CD店里买这张专辑。  而CD店里只剩下...
  • yang_ge_98
  • yang_ge_98
  • 2015-07-08 10:34:33
  • 7110

成语背后的故事

不认识这些成语??华屋秋墟?抑塞磊落?坂上走丸?鞭辟入里?厝火积薪?丁公凿井?杜门却扫?峨冠博带?管窥蠡测?怀瑾握瑜?没听过这些成语?不知道这些成语的含义?不了解成语背后的故事?2010年7月4号,日...
  • thinknao
  • thinknao
  • 2010-07-15 14:57:00
  • 405

网红经济背后的故事

网红经济最近成为部分媒体热议的话题,这个在2015年内产生的新族群——网红一族,借助各大电商平台突显出自身的特色,借力自身的影响力来带动受众群体的消费行为,而它的出现是整个新经济力量的另一种体现。网红...
  • wikiWang
  • wikiWang
  • 2015-12-27 19:54:25
  • 1131

一首歌一个故事 -- 谁伴我闯荡

一首歌一个故事 -- 谁伴我闯荡“前面是那方,谁伴我闯荡,沿路没有指引,若我走上又是窄巷……”每次听到这几句歌词,总是忍不住悲从心来……念初一的时候,姐姐买了一个录音机,我正式开始了我的音乐之旅。也就...
  • pengjj
  • pengjj
  • 2006-07-31 15:39:00
  • 1759

网络歌曲《丁香花》背后的真实故事

2004 年,一首叫《丁香花》的网络歌曲感动了中国。这首歌的作者和演唱者名叫唐磊,是深圳的一个网络歌手,各大媒体把他誉为“刀郎之后,中国第二个‘自下而上’的红歌星”。    然而,你可曾知道,在这首歌...
  • liuhedong
  • liuhedong
  • 2005-04-23 20:05:00
  • 848

反入侵的艺术——黑客入侵背后的真实故事

  • 2014年08月20日 14:37
  • 7.27MB
  • 下载

HTML5背后的故事

乍一看,你可能觉得HTML5是网页编写语言HTML的第5个版本。但实际上,这背后的故事可乱得多。 HTML5是一个叛逆。它是由一群自由思想者组成的团队设计出来的,这个团队的成员并不负责制定官方HTML...
  • turingbooks
  • turingbooks
  • 2012-08-22 11:34:10
  • 983

昂达757,真的是垃圾!

以前用的是RM970,音质视频的效果都很好,就是屏幕脆弱了点,按键的手感不怎样可惜掉了,哭... 打算换一个,选择了昂达757,昨天买的,回来就后悔了... 里面的样例视频都是很小的,快进后没什么异样...
  • liliflashfly
  • liliflashfly
  • 2009-01-18 10:31:00
  • 505
    个人资料
    专栏达人 持之以恒
    等级:
    访问量: 67万+
    积分: 6022
    排名: 5265
    你还在一个人孤独的奋斗吗?
    其实,你并不寂寞,欢迎加入CSDN Java群,这里是你的另一个家!    点击加入:CSDN Java群
    博客专栏
    最新评论