码迷,mamicode.com
首页 > 其他好文 > 详细

JVM的基本结构和JVM内存结构

时间:2017-06-27 18:47:12      阅读:125      评论:0      收藏:0      [点我收藏+]

标签:动态申请   显示   运行时   垃圾回收算法   部分   栈空间   永久代   角度   如何   

JVM的基本结构和JVM的内存结构


 

这里介绍一下JVM在启动后,作为操作系统的一个进程的基本结构,以及从操作系统角度看,JVM如何管理它从操作系统里申请来的内存的,也就是JVM的内存结构或者叫JVM内存模型。

 

1、JVM的基本结构

================

技术分享

JVM启动后,对操作系统来说,JVM是一个的进程,这个进程的基本结构如上图所示。它包括:类加载器子系统、运行时数据区、执行引擎和本地方法接口

运行时数据区是JVM从操作系统申请来的堆空间和操作系统给JVM分配的栈空间的总称。JVM为了运行Java程序,又进一步对运行时数据区进行了划分,划分为Java方法区、Java堆、Java栈、PC寄存器、本地方法栈等,这里JVM从操作系统申请来的堆空间被划分为方法区和Java堆,操作系统给JVM分配的栈空间构成Java栈。

 

2、从操作系统角度看JVM的内存结构

==============================

从Linux操作系统角度看,JVM是一个普通的应用程序进程,那么JVM具有一般操作系统进程的特点,一般的进程的内存结构和JVM进程的内存结构是类似的,它们的内存结构类比参见下图。

技术分享

Linux把一个程序在内存中所占的空间分为:方法区、数据区、堆区、栈区,对应地,JVM在内存中也有JVM方法区、JVM数据区、堆区和栈区。

代码区中存放应用程序的机器代码,运行过程中代码不能被修改,具有只读和固定大小的特点。数据区中存放了应用程序中的全局数据,静态数据和一些常量字符串等,其大小也是固定的。堆是运行时程序动态申请的空间,属于程序运行时直接申请、释放的内存资源。栈区用来存放函数的传入参数、临时变量,以及返回地址等数据。未使用区是分配新内存空间的预备区域。

由图中可以知道,JVM堆被JVM进一步分为:运行时数据区中Java的方法区和Java堆(图中显示的是:永久、新生、老年,这是分代垃圾回收时的术语,实际上永久代和Java方法区对应,新生代和老年代和Java堆对应),也就说Java方法区和Java堆其实都是JVM堆的一部分。

Java方法区包括了已被虚拟机加载的类信息、常量池、静态变量、即时编译器编译后的代码等数据,它实际上构成了Java程序的方法区和数据区。

 

JVM的垃圾回收器主要工作是回收Java堆中的垃圾内存,具体来说就是JVM堆中的新生代和老年代所占的内存。垃圾回收的内容主要关注这两块区域。

关于垃圾回收算法和垃圾回收器可以单独写一篇文章总结,这里不再写。

 

3、JVM的类加载子系统

===================

JVM的类加载子系统主要用来加载和卸载Java类,其工作过程对应于一个类在内存中的生命周期,一般可以分为:加载、连接、初始化、使用类和卸载类。

这个子系统的工作内容可以单独总结为一篇文章,目前不在这里多写。

 

4、执行引擎

=============

执行引擎是JVM执行Java字节码的核心,执行方式主要分为:解释执行、编译执行、自适应优化执行、硬件芯片执行等方式。关于执行引擎也可以单独总结。

 

参考文献

1、《深入理解Java虚拟机》,周志明。

2、Linux与JVM的内存关系分析,http://tech.meituan.com/linux-jvm-memory.html

3、http://blog.hesey.net/2011/04/introduction-to-java-virtual-machine.html

 

JVM的基本结构和JVM内存结构

标签:动态申请   显示   运行时   垃圾回收算法   部分   栈空间   永久代   角度   如何   

原文地址:http://www.cnblogs.com/zhangzl419/p/7086391.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!