其实写java程序都应对jvm有一定的理解。这里就大概记录一些本人的一些看法,写得有点乱(ಡωಡ) 。

    JAVA虚拟机其实就是使用软件实现的一种虚拟的机器,在不同平台实现功能相同的虚拟机就是实现JAVA跨平台的方式。我们可以假想这个虚拟的机器同样有处理器、寄存器等,平时我们使用才c++编写面对的执行容器是一个具体的平台,而针对不同平台,我们必须采用不同的方式编译(或是不同的代码实现方式),这对开发者来说是很烦恼的。而JAVA编写的程序可能在不同平台不同的虚拟机上运行,我们只负责编写程序,而虚拟机帮我们实现跨平台。

    再回头说JVM,我们每写的一个JAVA程序必须是有main方法作为入口的(即使没有main方法,基于这个程序之上的容器一定会有),没当我们运行一个JAVA程序,JVM的生命周期也就开始了,这个程序结束运行后,JVM的生命周期也就结束了。如果我们在同一台机器上运行3个JAVA程序,也就会有三个JVM在运行,它的生命周期是和程序绑定的。

    main标志程序的开始,而结束呢?

    我们一个JAVA中有后台线程(也说守护线程)和普通线程,main也是一个普通线程,仅当所有非后台线程运行结束,这个JAVA程序也就运行结束了。

    守护线程:主线程结束后其他线程的工作并不是必须的的时候(不影响要实现的业务),我们可以将这样的线程设置为后台线程,比如jvm的资源回收线程就是一个典型的后台线程。只要还有非后台线程没有结束运行,程序就不会结束,相反,当最后一个非后台线程结束时,不管是否还有后台线程正在运行,程序也会随即结束。

    再看下JVM中的内存:

    1、Heap(堆):一个Java虚拟实例中只存在一个堆空间

    2、MethodArea(方法区域):被装载的class的信息存储在Methodarea的内存中。当虚拟机装载某个类型时,它使用类装载器定位相应的class文件,然后读入这个class文件内容并把它传输到虚拟机中。

    3、JavaStack(java的栈):虚拟机只会直接对Javastack执行两种操作:以帧为单位的压栈或出栈

    4、ProgramCounter(程序计数器):每一个线程都有它自己的PC寄存器,也是该线程启动时创建的。PC寄存器的内容总是指向下一条将被执行指令的饿地址,这里的地址可以是一个本地指针,也可以是在方法区中相对应于该方法起始指令的偏移量。

    5、Nativemethodstack(本地方法栈):保存native方法进入区域的地址

    类加载器:

     《JAVA编程思想》类型信息一章中也有一些说明:每当编写并编译一个新类,就会产生一个Class对象,而这个对象由“类加载器(JVM的一个子系统)”生成。

(手机编程太费事,暂停编辑)