Java虚拟机结构

时间:2022-09-07 09:09:37
一、JVM主要的结构如下:
Java虚拟机结构
Java虚拟机结构
二、各个区域功能介绍

1)、方法区(Method Area):
        (1)用于存储虚拟机加载的类信息、常量、静态变量等,是各个线程共享的内存区域;
        (2)默认最小值为16MB,最大值为64MB,可以通过-XX:PermSize 和 -XX:MaxPermSize 参数限制方法区的大小;
        (3)方法区中还有一部分是运行时常量池,主要用来存储编译时生成的字面量和符号引用,常量也可以在运行时产生,如String的intern方法;
        (4)和Java堆一样不需要连续的内存和可以选择固定大小或可扩展外,还可以选择不实现垃圾收集。
2)、栈:
        (1)Java虚拟机栈是线程私有的,生命周期与线程相同。
        (2)每个方法被执行的时候都同时创建一个栈帧(stack frame),用于存储局部变量表,操作栈,动态链接,方法出口等信息。每一个方法执行完的过程就对应栈帧在栈中进入进出的过程。栈帧由三部分组成:局部变量区、操作数栈、帧数据区。
        (3)JVM虚拟机栈中的局部变量表存储了编译期可知的各种基本数据类型。局部变量表所需要的空间在编译期就分配完成。
        (4)栈帧是方法运行期的基础数据结构。
3)、本地方法栈(Native Method Stack):
        (1)本地方法栈为JVM虚拟机使用到的Native方法服务。

在HotSpot中并不区分虚拟机栈和本地方法栈


4)、堆(Heap):
        (1)Java虚拟机所管理的内存中最大的一块。
        (2)Java堆是所有线程共享的区域,在虚拟机启动时创建。
        (3)内存区域的唯一目的就是存放对象实例,所有的对象实例以及数组都在堆上分配内存。
        (4)Java堆是JVM垃圾回收机制主要管理的内存区域,Java堆可以处于内存上不连续的内存空间。
5)、程序计数器:
        (1)一块比较小的内存空间,它的作用可以看做是当前线程所执行的字节码的行号指示器
        (2)字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令、分支,循环、跳转、异常处理、线程恢复等都需要依赖程序计数器。
6)、运行时常量池:
        (1)运行时常量池是方法区的一部分。
        (2)Class文件中除了有类的版本、字段、方法接口描述等信息外,还有一项信息是常量池,用于存放编译期生成的各种字面量和符号引用,这部分内容将在类加载
        之后存放到方法区的运行时常量池。
7)、直接内存:
        由于Java引进了NIO,引入了通道和缓冲区的IO方式,可以调用Native方法直接分配堆外内存,这个堆外内存就是本机内存,不会影响堆内存大小。

Java虚拟机结构的更多相关文章

  1. JVM规范系列第2章:Java虚拟机结构

    本规范描述的是一种抽象化的虚拟机的行为,而不是任何一种(译者注:包括 Oracle 公司自己的 HotSpot 和 JRockit 虚拟机)被广泛使用的虚拟机实现. 记住:JVM规范是一种高度抽象行为 ...

  2. Java虚拟机 - 结构原理与运行时数据区域

    http://liuwangshu.cn/java/jvm/1-runtime-data-area.html 前言 本来计划要写Android内存优化的,觉得有必要在此之前介绍一下Java虚拟机的相关 ...

  3. 【Java虚拟机结构(第1部分)数据类型】摘要

    <Java虚拟机规范(Java SE 7版)>作者:Tim Lindholm.Frank Yellin.Gilad Bracha.Alex Buckley 摘要:第二章 Java虚拟机结构 ...

  4. Jvm运行时数据区 —— Java虚拟机结构小记

    关于jvm虚拟机的文章网上都讲烂了.尤其是jvm运行时数据区的内容. 抱着眼见为实的想法,自己翻了翻JVM规范,花了点时间稍微梳理了一下. 以下是阅读Java虚拟机规范(Java SE 8版)的第二章 ...

  5. 每日一问:你了解 Java 虚拟机结构么?

    对于从事 C/C++ 程序员开发的小伙伴来说,在内存管理领域非常头疼,因为他们总是需要对每一个 new 操作去写配对的 delete/free 代码.而对于我们 Android 乃至 Java 程序员 ...

  6. The Structure of the Java Virtual Machine Java虚拟机结构 虚拟机内存模型

    小结: 1.实现一台Java虚拟机,只需正确读取class文件中的每一条字节码指令且能正确执行这些指令所蕴含的操作. 2.设计者决定:运行时数据区的内存如何布局,选择哪种垃圾收集算法,是否对虚拟机字节 ...

  7. java虚拟机规范&lpar;se8&rpar;——java虚拟机结构&lpar;三&rpar;

    2.6. 栈帧 栈帧用于存储数据和部分结果,同样也用于执行动态链接,返回方法的值和分派异常. 当方法被调用的时候会创建一个新的栈帧.当一个方法调用结束时,它对应的栈帧就被销毁了,不管是正常调用结束还是 ...

  8. java虚拟机规范&lpar;se8&rpar;——java虚拟机结构&lpar;二&rpar;

    2.5 运行时数据区域 java虚拟机定义了多个用于程序执行期间的运行时数据区域.这些数据区域中一些随着java虚拟机的启动而创建,随着虚拟机的退出而销毁.其他的数据区域时和线程相关的.线程相关数据区 ...

  9. java虚拟机规范&lpar;se8&rpar;——java虚拟机结构&lpar;一&rpar;

    本文翻译自:https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-2.html 第二章 虚拟机结构 本文档描述了一个抽象的虚拟机规范,并不描述 ...

随机推荐

  1. 线程本地变量ThreadLocal

    一.本地线程变量使用场景 并发应用的一个关键地方就是共享数据.如果你创建一个类对象,实现Runnable接口,然后多个Thread对象使用同样的Runnable对象,全部的线程都共享同样的属性.这意味 ...

  2. websocket通信 实现java模拟一个client与webclient通信

    发文原由: 熟悉socket通信的同学,对于socket模拟server与client,实现相互通信, 或者使用websocket与java模拟的websocket服务器通信(比如一个聊天室),对于这 ...

  3. Windows文件夹、文件源代码对比工具--WinMerge

    /********************************************************************** * Windows文件夹.文件源代码对比工具--WinM ...

  4. Expm 1&lowbar;2 实现快速排序的算法&comma;并尝试采用不同的方法实现线性的划分过程&period;

    package org.xiu68.exp.exp1; public class Exp1_2 { //实现快速排序算法,采用不同的方法实现线性划分的过程 public static void mai ...

  5. java中的instanceof用法详解

    instanceof是Java的一个二元操作符(运算符),也是Java的保留关键字.它的作用是判断其左边对象是否为其右边类的实例,返回的是boolean类型的数据.用它来判断某个对象是否是某个Clas ...

  6. JavaScript高级 面向对象(13)--构造函数的执行过程

    说明(2017-4-2 21:50:45) 一.构造函数是干什么用的: 1. 初始化数据的. 2. 在js给对象添加属性用的,初始化属性值用. 二.创建对象的过程: 1. 代码:var p = new ...

  7. grunt学习一

    grunt是前端自动化工具之一.下面是是grunt的简单小示例: 在使用grunt,确保安装nodejs,如果不清楚,可以百度找相关教程,这个教程已经烂大街了. 1.打开cmd,以管理员的身份.(或者 ...

  8. Extjs combox的异步加载

    很多朋友用 extjs  很多时候都要用到combo 而异步加载是用的最多的 今天我就举一个例子 了解combo的异步加载 Ext.onReady(function () { Ext.BLANK_IM ...

  9. poj3318 Matrix Multiplication

    poj3318 Matrix Multiplication 题意:给定$n*n(n<=500)$的矩阵$A,B,C$,如果$A*B==C$,输出“YES”,否则为“NO”:多组数据,$O(n^{ ...

  10. 《OpenGL编程指南第七版》学习——编译时提示&OpenCurlyDoubleQuote;error C2381&colon; &OpenCurlyDoubleQuote;exit” &colon; 重定义;&lowbar;&lowbar;declspec&lpar;noreturn&rpar; 不同”错误的解决办法

    解决办法一. #if defined(_WIN32) # ifndef GLUT_BUILDING_LIBextern _CRTIMP void __cdecl exit(int); 上面是glut. ...