Java main方法(Java main方法详解)
在Java中,main()方法是Java应用程序的入口方法,也就是说,程序在运行的时候,第一个执行的方法就是main()方法, 它最大的特点就是它的方法名字必须是main,方法类型必须是public static void的,方法必须接收一个字符串数组的参数, 这样程序在启动的时候就能接收外部传递进来的参数!
我们来一个最简单的例子Helloword的程序
public class Test
{
public static void main(String[] args)
{
System.out.println("Hello world!");
}
}
Java main方法所在的类是public修饰
首先Java 是面向对象语言,所以它必须在一个类里,这里我们的类名叫Test, 并且用 public 来修饰这是可访问的, 当然这里也只能是public, 接着就是一个class, 表示我们定义一个名为Test 的类,注意这里的定义必须是public, 因为只有public 操作系统才能访问到这个类的main方法.
Java 的main方法是静态方法
我们再看看这个main方法,首先它是一个静态方法, 用static来修饰,而用static修饰的方法以及变量是存储在虚拟机当中的方法区当中, 而不是堆区内(需要用new的形式),这样程序在启动的时候是直接访问这个方法区, 因此对于操作系统启动Java,不用实例去访问这是非常便利的!
Java 的main方法名称不能变
这个main方法的名称是不能变的,除了args这个参数名可变,其它的都不能变了,因为变了,JVM就无法识别程序运行的入口了, 重载都不行,因为重载了,jvm就不会执行这个main方法,我们都知道JVM内部有两种线程
- 守护线程 由JVM自己使用
- 非守护线程 由java自己创建(Java 也是可以创建守护线程的)
main方法是非守护线程,它作为程序 线程的起点,而其它任何线程也都是居于该线程启动,因此main方法至关重要,不容有错, 从中我们就可以看到,Java是一个非常严谨的开发语言!
Java 的main方法没有返回值
main 方法返回的是一个void类型,这是一个没有返回值的Java关键字, 背后的原因是因为在运行Java程序时,操作系统不需要Java的返回信息, 换句话说,操作系统拿了也没用;
Java 的main方法需要一个接收参数的入口
Java r main方法的参数是String[], 这是一个字符串数组, 也必须带这个参数,因此这里是接收命令行参数的唯一入口; 至于参数名称args, 它是arguments的缩写,变量默认名,大家都基本约定了是args,如果你不喜欢,也可以叫aaa, bbb,ccc, 只要符合Java的命名规则就可以了!
那这个字符数组到底有什么作用呢?
它的作用其实就是接收命令行输入参数的,命令行的参数之间用空格隔开。
linux 启动java程序的命令行脚本(这里只是作为演示main方法是如何接入命令行参数的)
exec "$JAVA" -Xms${mem}M -Xmx${mem}M -Denv="$env" -server -classpath "$CLASSPATH" $CLASS "$@"
参数说明
- $Java 表示 $JAVA_HOME/bin/java()
- -Xms 堆内存分配,初始分配内存, 默认是物理内存的1/64
- -Xmx 堆内存分配, 最大分配的内存由-Xmx指定
- -server 以server的方式启动
- -classpath java的类路径
- $CLASS 表示要启动的类
注意:
执行脚本传递参数是字符串,并且以空隔隔开!
JVM参数详细说明
- -XX:CMSInitiatingPermOccupancyFraction:当永久区占用率达到这一百分比时,启动CMS回收
- -XX:CMSInitiatingOccupancyFraction:设置CMS收集器在老年代空间被使用多少后触发
- -XX:+CMSClassUnloadingEnabled:允许对类元数据进行回收
- -XX:CMSFullGCsBeforeCompaction:设定进行多少次CMS垃圾回收后,进行一次内存压缩
- -XX:NewRatio:新生代和老年代的比
- -XX:ParallelCMSThreads:设定CMS的线程数量
- -XX:ParallelGCThreads:设置用于垃圾回收的线程数
- -XX:SurvivorRatio:设置eden区大小和survivior区大小的比例
- -XX:+UseParNewGC:在新生代使用并行收集器
- -XX:+UseParallelGC :新生代使用并行回收收集器
- -XX:+UseParallelOldGC:老年代使用并行回收收集器
- -XX:+UseSerialGC:在新生代和老年代使用串行收集器
- -XX:+UseConcMarkSweepGC:新生代使用并行收集器,老年代使用CMS+串行收集器
- -XX:+UseCMSCompactAtFullCollection:设置CMS收集器在完成垃圾收集后是否要进行一次内存碎片的整理
- -XX:UseCMSInitiatingOccupancyOnly:表示只在到达阀值的时候,才进行CMS回收
- -Xms:设置堆的最小空间大小。
- -Xmx:设置堆的最大空间大小。
- -XX:NewSize设置新生代最小空间大小。
- -XX:MaxNewSize设置新生代最大空间大小。
- -XX:PermSize设置永久代最小空间大小。
- -XX:MaxPermSize设置永久代最大空间大小。
- -Xss:设置每个线程的堆栈大小
-XX:NewRatio设置年轻代和年老代的比值。如:为3,表示年轻代与年老代比值为1:3,年轻代占整个年轻代年老代和的1/4