JVM Specification 整体架构

JVM Specification 整体架构

出自:http://developer.51cto.com/art/201009/227977.htm

你对JVM内存结构是否了解,这里和大家分享一下,JVM内存结构主要包括两个子系统和两个组件,这两个组件分别是Runtimedataarea(运行时数据区域)组件和Nativeinterface(本地接口)组件。

JVM内存结构

近期看了看Java内存泄露的一些案例,跟原来的几个哥们讨论了一下,深入研究发现JVM里面还是有不少以前不知道的细节,这里稍微剖析一下。先看一看JVM内部结构——

JVM内存结构


如图所示,JVM内存结构主要包括两个子系统和两个组件。两个子系统分别是Classloader子系统和Executionengine(执行引擎)子系统;两个组件分别是Runtimedataarea(运行时数据区域)组件和Nativeinterface(本地接口)组件。

Classloader子系统的作用:

根据给定的全限定名类名(如java.lang.Object)来装载class文件的内容到Runtimedataarea中的methodarea(方法区域)。Java程序员可以extendsjava.lang.ClassLoader类来写自己的Classloader。

Executionengine子系统的作用:

执行classes中的指令。任何JVMspecification实现(JDK)的核心都是Executionengine,不同的JDK例如Sun的JDK和IBM的JDK好坏主要就取决于他们各自实现的Executionengine的好坏。

Nativeinterface组件:

与nativelibraries交互,是其它编程语言交互的接口。当调用native方法的时候,就进入了一个全新的并且不再受虚拟机限制的世界,所以也很容易出现JVM无法控制的nativeheapOutOfMemory。

RuntimeDataArea组件:

这就是我们常说的JVM的内存了。它主要分为五个部分——

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

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

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

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

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

以上五部分只有Heap和MethodArea是被所有线程的共享使用的;而Javastack,Programcounter和Nativemethodstack是以线程为粒度的,每个线程独自拥有自己的部分。本节关于JVM内存结构简单介绍到这里。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/100467.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • idea查看激活码_通用破解码

    idea查看激活码_通用破解码,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月15日
    61
  • vsftpd安装包下载_vsftp搭建

    vsftpd安装包下载_vsftp搭建1、在profile文件中设置相关环境变量,允许使用代理上网,如果能联网则不需要配置主要为了能够使用第一种安装方式,如果不可行则可以使用第二种安装方式vi/etc/profile##在文件中加上以下配置信息,该配置为代理服务器地址,根据实际情况定义,该服务器地址必须可联网exporthttp_proxy=http://192.168.1.1:3128exporthttps_pro…

    2022年9月25日
    4
  • Linux rootfs_hdfs shell命令

    Linux rootfs_hdfs shell命令本文阐述Linux中的文件系统部分,源代码来自基于IA32的2.4.20内核。总体上说Linux下的文件系统主要可分为三大块:一是上层的文件系统的系统调用,二是虚拟文件系统VFS(VirtualFilesystemSwitch),三是挂载到VFS中的各实际文件系统,例如ext2,jffs等。本文侧重于通过具体的代码分析来解释Linux内核中VFS的内在机制,在这过程

    2022年9月28日
    4
  • Python爬虫入门这一篇就够了「建议收藏」

    Python爬虫入门这一篇就够了「建议收藏」何谓爬虫所谓爬虫,就是按照一定的规则,自动的从网络中抓取信息的程序或者脚本。万维网就像一个巨大的蜘蛛网,我们的爬虫就是上面的一个蜘蛛,不断的去抓取我们需要的信息。爬虫三要素抓取分析存储基础

    2022年7月6日
    26
  • 线程死锁的原因及解决方法_多线程队列

    线程死锁的原因及解决方法_多线程队列很久之前就听过互联架构中有三高,高可用、高并发、高性能,多线程是处理高并发问题的基石,起步阶段一定要对线程有一个系统深刻的印象,为以后做准备

    2022年10月15日
    2
  • C语言 字符串分割

    C语言 字符串分割C语言字符串分割一、简述记–字符串分割,strtok()函数的使用例子、自己实现split()函数。二、例子代码#include<stdio.h>#include<string.h>/**函数:split*描述:按指定分隔符分割字符串*参数:* str:要分割的字符串* strLen:要分割…

    2022年6月9日
    27

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号