深入Java虚拟机,JVM内核-原理,诊断与优化+内存模型+虚拟机原理

1. JVM生命周期

  • 启动。启动一个Java程序时,一个JVM实例就产生了,任何一个拥有public static void main(String[] args)函数的class都可以作为JVM实例运行的起点。

  • 运行。main()作为该程序初始线程的起点,任何其他线程均由该线程启动。

  • 消亡。当程序中的所有非守护线程都终止时,JVM才退出;若安全管理器允许,程序也可以使用Runtime类或者System.exit()来退出。

  一个运行中的Java虚拟机有着一个清晰的任务:执行Java程序。程序开始执行时他才运行,程序结束时他就停止。你在同一台机器上运行三个程序,就会有三个运行中的Java虚拟机。 Java虚拟机总是开始于一个main()方法,这个方法必须是公有、返回void、直接受一个字符串数组。在程序执行时,你必须给Java虚拟机指明这个包换main()方法的类名。main()方法是程序的起点,他被执行的线程初始化为程序的初始线程。程序中其他的线程都由他来启动。

  Java中的线程分为两种:守护线程 (daemon)和普通线程(non-daemon)。守护线程是Java虚拟机自己使用的线程,比如负责垃圾收集的线程就是一个守护线程。当然,你也可以把自己的程序设置为守护线程。包含main()方法的初始线程不是守护线程。

  只要Java虚拟机中还有普通的线程在执行,Java虚拟机就不会停止。如果有足够的权限,你可以调用exit()方法终止程序。

 

2. JVM体系结构

  1) 类装载器(ClassLoader)(用来装载.class文件)

  2) 执行引擎(执行字节码,或者执行本地方法)

  3) 运行时数据区(方法区、堆、java栈、PC寄存器、本地方法栈)

 

3. JVM运行时数据区

3.1 Java堆(Heap)

  • 被所有线程共享的一块内存区域,在虚拟机启动时创建

  • 用来存储对象实例

  • 可以通过-Xmx和-Xms控制堆的大小

  • OutOfMemoryError异常:当在堆中没有内存完成实例分配,且堆也无法再扩展时。

  java堆是垃圾收集器管理的主要区域。java堆还可以细分为:新生代(New/Young)、旧生代/年老代(Old/Tenured)。持久代(Permanent)在方法区,不属于Heap。


猜你喜欢

转载自blog.51cto.com/13882008/2170762