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

Java 获取PID