博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JVM的堆(heap)、栈(stack)和方法区(method)
阅读量:6685 次
发布时间:2019-06-25

本文共 1072 字,大约阅读时间需要 3 分钟。

JVM主要由类加载器子系统、运行时数据区(内存空间)、执行引擎以及与本地方法接口等组成。其中运行时数据区又由方法区Method Area、堆Heap、Java stack、PC寄存器、本地方法栈组成。

堆区:

1.存储的全部是对象,每个对象都包含一个与之对应的class的信息。(class的目的是得到操作指令)
2.jvm只有堆区(heap)和方法区(下面)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身.
3.一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。
栈区:  
1.每个线程包含一个栈区,栈中只保存基础数据类型的对象和自定义对象的引用(不是对象),对象都存放在堆区中
2.每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问。
3.栈分为3个部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令)。
4.由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.
静态区/方法区:
1.方法区又叫静态区,跟堆一样,被所有的线程共享。方法区包含所有的class和static变量。
2.方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量。
3.全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。

 

方法区

类型信息和类的静态变量都存储在方法区中。方法区中对于每个类存储了以下数据:

a.类及其父类的全限定名(java.lang.Object没有父类)

b.类的类型(Class or Interface)

c.访问修饰符(public, abstract, final)

d.实现的接口的全限定名的列表

e.常量池

f.字段信息

g.方法信息

h.静态变量

i.ClassLoader引用

j.Class引用

可见类的所有信息都存储在方法区中。由于方法区是所有线程共享的,所以必须保证线程安全,举例来说,如果两个类同时要加载一个尚未被加载的类,那么一个类会请求它的ClassLoader去加载需要的类,另一个类只能等待而不会重复加载。

此外为了加快调用方法的速度,通常还会为每个非抽象类创建私有的方法表,方法表是一个数组,存放了实例可能被调用的实例方法的直接引用。方法表对于多态有非常重要的意义,具体可以参照《》一文中“多态的实现”一节。

在Sun JDK中,方法区对应了持久代(Permanent Generation),默认最小值为16MB,最大值为64MB。  

 

转载地址:http://zfhao.baihongyu.com/

你可能感兴趣的文章
【算法】打靶问题求解
查看>>
sql Server中SET QUOTED_IDENTIFIER的使用
查看>>
第五章:输入输出(IO)管理
查看>>
asp.net的JSON数据进行序列化和反序列化
查看>>
docker学习笔记2:容器操作
查看>>
Java文件合并
查看>>
PHP中require()文件包含的正确用法
查看>>
Stop sucking,Become awesome.这一年我做到了么
查看>>
[Android]Android MVP&依赖注入&单元测试
查看>>
HDU 5682 zxa and leaf 二分 树形dp
查看>>
转:android 设计模式合集
查看>>
DEDECMS之八 漏洞错误和疑难杂症
查看>>
matlab GUI之 -- 绘图
查看>>
[转]车牌识别及验证码识别的一般思路
查看>>
[javaEE] javaweb的mvc设计思想
查看>>
Android中dip、dp、sp、pt和px的区别
查看>>
对比Linux系统和Windows系统哪个更好
查看>>
Tesseract-OCR 字符识别---样本训练
查看>>
GIS-007-Terrain跨域访问
查看>>
CentOS搭建LNMP环境
查看>>