搜索
搜 索
本版
文章
帖子
用户
图文精华
hadoop-2.6.0+zookeeper-3.4.6+hbase-1.0.0+hive-1.1.0完全分布 ...
首页
Portal
专题
BBS
面试
更多
登录
注册
用户组:游客
主题
帖子
云币
我的帖子
我的收藏
我的好友
我的勋章
设置
退出
导读
淘贴
博客
群组
社区VIP
APP下载
今日排行
本周排行
本周热帖
本月排行
本月热帖
会员排行
About云-梭伦科技
»
专题
›
技术学习(版主发帖区)
›
编程语言
›
Java语言
›
jvm内存模型
0
4
1
分享
jvm内存模型
4145pp
发表于 2017-9-29 18:37:05
[显示全部楼层]
阅读模式
关闭右栏
4
6150
一、内存模型
运行时数据区包含
方法区:所有线程共享
堆:所有线程共享
java栈:线程独享自己的空间
pc寄存器(程序计数器)、线程独享自己的空间
本地方法栈:hotspot的本地方法栈和java栈在一起
java栈
创建新线程时,jvm都会分配一个java栈,jvm只会正对java栈执行进栈出栈两种操作。
java栈是由许多栈帧组成[stack frame],一个栈帧包含一个java方法调用的状态。当线程调用一个java方法时,虚拟机压入一个新的栈帧到java栈中,方法返回时,弹出该栈帧。
一个新的线程被创建时,它都将得到属于自己的pc寄存器(程序计数器)和一个java栈
线程执行方法时,pc寄存器的值总是指向下一条将被执行的指令,而该线程的java栈总是存储正在调用的方法中的状态--局部变量、入参、返回值、中间结果等,都是线程私有的。
本地方法的调用:依赖具体实现存储在本地方法栈中或寄存器,也可能是特定实现相关的内存区。
方法区:jvm规范规定的一个概念,hotspot的实现为永久代1.8后放弃了
存储被装载类的信息
全类名
直接超类的全类名列表
类的类型:类或接口
访问修饰符:public、abstract、final等
常量池:虚拟机为每个被装载的类维护一个常量池,是常量的有序集合。包括直接常量和对其他类型、字段、和方法的符号引用。编译时常量是指final的和编译时已知初始值的类变量
字段信息:按照字段的声名顺序保存字段名、字段类型、修饰符
方法信息:方法名、返回类型、参数个数和类型(按声名顺序)、修饰符,如果不是抽象方法或本地方法还保存方法的字节码、操作数栈和该方法的栈帧中的局部变量区的大小、异常表
除了常量以外的所有静态变量:
一个装载该类的ClassLoader引用
一个到该类的引用:每一个被加载的类,虚拟机都会相应的为它创建一个java.lang.Class实例,虚拟机必须把这个实例和方法区中的类型数据关联起来
对方法区数据的访问必须是线程安全的,因为方法区是所有线程共享的
方法区大小不必是固定的,虚拟机可以根据应用程序的需要动态调整。可以是不连续的,可以在一个堆(甚至是虚拟机自己的堆)上自由分配,可以由用户指定初始大小最大最小等
可被垃圾回收:回收一些不在引用的类
JDK1.8
永久代(Permanent Generation )的替代者:元空间(Metaspace),JVM参数PermSize 和 MaxPermSize会被忽略,当前在启动时会有警告信息
堆
java运行时创建的所有类实例和数组都放在同一个堆中。
java对象的基本数据由自己和父类的实例变量组成
程序计数器
每个线程都有自己的pc寄存器,他是在线程启动时创建的,pc寄存器的大小的一个字长,因此既能持有一个本地指针又能持有一个retureAddress。当线程执行某个java方法时,pc寄存器的内容总是下一条将被执行的指令地址。这个地址可以是一个本地变量也可以是在方法区字节码中相对于该方法起始指令的偏移量。如果正在执行本地方法,此时值是undefined
本地方法栈
未知
直接内存
Nio:基于channel和buffer的io方式,native函数直接分配堆外内存,DirectByteBuffer对象作为这块内存的引用
元数据区
(Metaspace)hotspot JDK1.8开始使用
[JEP122][2]提议取消永生代,方法区作为概念上的区域仍然存在。原先永生代中类的元信息会被放入本地内存(元数据区,metaspace),将类的静态变量和内部字符串放入到java堆中。
元数据区放在本地内存中
MaxMetaspaceSize设置元数据区大小
如果类元数据的空间占用达到参数“MaxMetaspaceSize”设置的值,将会触发对死亡对象和类加载器的垃圾回收。
回复
使用道具
举报
提升卡
置顶卡
沉默卡
喧嚣卡
变色卡
千斤顶
显身卡
已有(4)人评论
电梯直达
正序浏览
tingxuec
发表于 2017-10-2 11:50:56
方法区、永久代是不是一个东西
回复
使用道具
举报
显身卡
wx_ZhVeqQM7
发表于 2017-10-3 12:00:51
厉害厉害~
回复
使用道具
举报
显身卡
liuyuze_hanbing
发表于 2017-10-17 09:44:27
tingxuec 发表于 2017-10-2 11:50
方法区、永久代是不是一个东西
方法区是jvm规范定义的一个概念,不同的java虚拟机有不同的实现,永久代hotspot对方法区的实现,1.7就开始移除永久代了,1.8已经完全移除了永久代
原来永久代存放的内容一部分放在了堆,一部分放在了
元空间(Metaspace),元空间是1.8新增的一块
回复
使用道具
举报
显身卡
112049159
发表于 2018-5-1 15:00:43
学习ing
回复
使用道具
举报
显身卡
还有一些帖子被系统自动隐藏,点此展开
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
本版积分规则
发表回复
回帖后跳转到最后一页
发表新帖
4145pp
新手上路
关注
主题
帖子
粉丝
TA的主题
jvm内存模型
2017-9-29
24小时热文
像高手一样发言:七种常见工作场景的说话之
幕后产品:打造突破式产品思维
副业警钟,新型法律碰瓷发财方式:批量诉讼
Spark机器学习
Spark机器学习算法、源码及实战详解
关闭
推荐
/2
中文版ChatGPT
1.无需魔法 2.提高编程效率 3.提高文档能力
查看 »
新手帮助
新手帮助:注册遇到问题,领取资源,加入铁粉群,不会使用搜索,如何获取积分等
查看 »
意见
反馈