1. jvm的本质
用于解释和运行Java程序的C++程序,本质就是一个程序。
2. JVM主要由三部分组成
(1)执行引擎:用于解释字节码
(2)类加载器:将编译后的字节码文件加载到JVM中的内存里,以及将一些核心类库等加载进去
(3)运行时数据区:主要包括线程共享区和线程独占区
3. 内存模型
(1)JVM对于操作系统来说,就是一个C++程序,所以JVM本身的内存结构就是C/C++的内存模型(即:操作系统的进程的内存模型)
(2)Java程序栈和堆都是在JVM堆上分配的。 java的内存模型如下图所示:
为什么Java的堆栈不在JVM的栈上分配? 原因:JVM的栈是受操作系统自动管理的,随时可能被回收
为什么不直接使用JVM堆呢?非要在JVM堆的基础上重新实现堆呢? 原因:C++的堆内存是程序员分配和释放的,不是操作系统自动管理,无法实现自动管理。
4. java程序的进程
启动一个Java应用程序时,会启动一个JVM进程。在这个JVM进程内部,所有Java程序代码都是以线程来运行的。
JVM找到程序的入口点main()方法,然后运行main()方法,这样就产生了一个线程,这个线程被称为主线程。当main()方法结束后,主线程运行完成,JVM进程也随即退出。
每当使用Java命令执行一个class类时,实际上就是启动了一个JVM进程。理论上,在该进程的内部至少会启动两个线程,一个是main线程,另一个是GC(垃圾回收)线程。实际上,执行一个Java程序后,线程数量远远不止两个,达到了18个之多。
总结:
Java中的直接内存指的是操作系统提供的堆空间 java进程 代码段 数据段 栈 ---------------------------- 堆 JVM内存模型 虚拟机栈:存放方法调用过程中的参数、局部变量和返回值。(每个线程都有) 本地方法栈:每个线程都有,调用底层非Java的本地代码,存放调用过程中的参数、局部变量和返回值等信息。(每个线程都有) 堆区:共享 程序计数器:指示下一条需要执行的指令的地址(每个线程都有) 方法区:共享(java7之后去掉),JDK1.8之后使用元数据空间代替了方法区,不再使用JVM内存,而是使用直接内存标签:Java,jvm,模型,程序,线程,内存,JVM,进程 From: https://www.cnblogs.com/dkhlaojogo/p/17106636.html