>>分享Java编程技术,对《Java面向对象编程》等书籍提供技术支持 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 24831 个阅读者 刷新本主题
 * 贴子主题:  概览JVM的基本结构和JVM的内存结构 回复文章 点赞(0)  收藏  
作者:zhangzl419    发表时间:2017-06-30 11:30:38     消息  查看  搜索  好友  邮件  复制  引用

概览JVM的基本结构和JVM的内存结构
====================================


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

搞清楚了JVM的结构和JVM的内存结构,就从整体上对JVM有了一个把握,这样继续深入学习Java内存管理、JVM垃圾回收、JVM类加载机制等局部技术的时候,心中就有了全局,这样既见森林,又见树木,才能学的明白。


1、JVM的基本结构

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



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

运行时数据区是JVM从操作系统申请来的堆空间和操作系统给JVM分配的栈空间的总称。JVM为了运行Java程序,又进一步对运行时数据区进行了划分,划分为Java方法区、Java堆、Java栈、PC寄存器、本地方法栈等,这里JVM从操作系统申请来的堆空间被划分为方法区和Java堆,操作系统给JVM分配的栈空间构成Java栈。
此主题相关图片如下:
点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小


程序猿的技术大观园:www.javathinker.net
  Java面向对象编程-->多线程(上)
  JavaWeb开发-->使用Session(Ⅰ)
  JSP与Hibernate开发-->Spring、JPA与Hibernate的整合
  Java网络编程-->ServerSocket用法详解
  精通Spring-->组合(Composition)API
  Vue3开发-->Vue组件开发基础
  TCP、UDP及Socket代码示例
  NIO模式的IO多路复用底层原理
  JAVA锁相关知识总结
  深入Java单例模式
  十分钟带你搞懂 Java AQS 核心设计与实现!
  内部类的编程练习题
  最实用的10个重构小技巧排行榜,你都用过哪些?
  Java注解的定义和使用
  NoClassDefFoundError和ClassNotFoundException的区别
  JNI_Java Native Interface的用法
  Java设计模式:享元模式
  Java入门实用代码:线程状态监测
  Java入门实用代码:修改链表LinkedList
  史上最全正则表达式合集(马上收藏)
  java实现PPT转化为PDF
  更多...
 IPIP: 已设置保密
楼主      
该用户目前不在线 zhangzl419 
  

威望: 0
级别: 高级天王 [荣誉]
魅力: 258
经验: 258
现金: 1250
发文章数: 31
注册时间: 2017-02-19
 消息  查看  搜索  好友  邮件  复制  引用


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

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

从Linux操作系统角度看,JVM是一个普通的应用程序进程,那么JVM具有一般操作系统进程的特点,一般的进程的内存结构和JVM进程的内存结构是类似的,它们的内存结构类比参见下图。
点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小


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

代码区  中存放应用程序的机器代码,运行过程中代码不能被修改,具有只读和固定大小的特点。

数据区  中存放了应用程序中的全局数据,静态数据和一些常量字符串等,其大小也是固定的。

堆      是运行时程序动态申请的空间,属于程序运行时直接申请、释放的内存资源。

栈区    用来存放函数的传入参数、临时变量,以及返回地址等数据。未使用区是分配新内存空间的预备区域。

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

Java方法区,在分代垃圾回收时也被称为永久区,包括了已被虚拟机加载的类信息、常量池、静态变量、即时编译器编译后的代码等数据,它实际上构成了Java程序的方法区和数据区。垃圾回收器也会对这部分内存进行回收,比如常量池的清理和类的卸载。

(这里要注意区分JVM堆和Java堆,JVM方法区和Java方法区)

Java堆包括新生代和老年代,新生代包括Edge区两个Survivor区(from Survivor 和 To Survivor)。

JVM的垃圾回收器主要工作是回收Java堆中的垃圾内存,具体来说就是JVM堆中的新生代和老年代所占的内存。垃圾回收的内容主要关注这两块区域。运行Java程序之前,可以通过Xms(Java堆初始大小)和Xmx(Java堆最大值)来调整堆内存。

关于JVM的垃圾回收器的工作过程,和它回收垃圾内存时所遵循的策略也即垃圾回收算法,可以单独写一篇文章总结,这里不再写。



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

这个子系统的每一个阶段的工作内容可以单独总结为一篇文章,比如类的加载和类加载器,目前不在这里多写。



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



[这个贴子最后由 zhangzl419 在 2017-07-01 10:58:46 重新编辑]
发文章时间 2017-06-30 11:33:21
 IPIP: 已设置保密 1 楼     
该用户目前不在线 sunweiqin 
  

威望: 0
级别: 高级天王 [荣誉]
魅力: 680
经验: 680
现金: 1528
发文章数: 191
注册时间: 2016-09-12
 消息  查看  搜索  好友  邮件  复制  引用


对JVM的工作原理讲得很深入透彻!
发文章时间 2017-06-30 13:55:34
 IPIP: 已设置保密 2 楼     
1页 2条记录 当前第1
发表一个新主题 开启一个新投票 回复文章


中文版权所有: JavaThinker技术网站 Copyright 2016-2026 沪ICP备16029593号-2
荟萃Java程序员智慧的结晶,分享交流Java前沿技术。  联系我们
如有技术文章涉及侵权,请与本站管理员联系。