[java基础]对jvm内存模型理解

今天来说一说java内存模型,因为jvm就是运行在内存里的,所以内存模型全部是存在内存里的。
jvm内存模型主要分为五大区域,程序计数器,本地方法栈,java栈区,方法区,和堆区。下面一个一个来看下。
在这里插入图片描述
灰色是区域是线程独有的,它包括是java栈区,本地方法栈和程序计数器都,而堆区和方法区是线程公有的。

1.程序计数器

程序计数器,它是用来存储java的程序的当前执行到的内存地址(你可以理解为程序的行号),java的分支,循环,跳转、异常处理、以及线程恢复都会依赖这个计数器来完成,一个单核CPU在同一时间节点只会执行一个线程的一条指令,每一个线程都有多个指令,为了在线程切换的时候找到上次执行的位置,每个线程都有一段独立的程序计数器,它们都需要独自把执行的行号存储下来。
概念太干了,来点水
手机都有吧,当你在带着耳机听着歌的同时,刷着微博,这样手机就会同时处理两个事件
1.播放邓紫棋的泡沫的第5秒到第10秒
2.加载下一条王建国的微博消息
你以为是同时进行的,其实在CPU的微观世界里,他是有顺序的,CPU也不比人聪明到哪去,单核CPU在同一个时间点时也只能做一件事,他执行完播放音乐,然后切换到加载微博,只是切换的时间很短人类感觉不到罢了。计算机执行播放音乐,就是找到放歌指令的内存地址,执行她,然后把指令地址写到自己小本本(程序计数器)上,待微博加载完后,再次从自己的小本本,找到上次做到那了,接着上次的做,就这样。当然程序的分支(if,else)、循环(for)、跳转(引用另一个方法)、和异常处理也是通过修改这个小本本上的行号来实现的。

2.方法区

方法区是用来存储常量、静态变量和类信息的,就是编译器,编译完成后的代码数据

3.java栈区

栈区是与线程关联的(人在塔在的关系),每一个线程都有自己独立的java栈,每一个java栈都包含多个栈帧, 这些栈帧都是与方法 关联起来的,每运行一个方法,都会创建一个栈帧,每个栈帧里都包含,局部变量,操作栈和方法返回值,每当一个方法执行完毕后,该栈帧都会弹出栈的元素作为返回值,并且清除这个栈帧,java栈的栈顶就是当前执行的方法,程序计数器也会指向这个地址,
只有这个活动的栈帧的局部变量可以被操作栈使用,当这个栈帧调用到其他方法时,与它相对应的新的栈帧就会创建,新的栈帧被放到java栈的栈顶,变为当前活动的栈,同样只有这个栈的变量可以被使用,当这个栈帧中的指令都执行完毕,这个栈帧被移除,刚才的栈帧变成活动的栈帧,前面的栈帧的返回值变成该栈帧的一个操作数。
由于java栈是线程独立的,所以不需要考虑数据一致性的问题。
涉及栈的异常有一个就是,咱们常见的stackoverflowError,它主要在当申请的栈的深度大于虚拟机允许的最大值的时,就会抛出此异常。

4.堆区

堆区是存放对象和数组的地方,个人感觉是因为,因为堆区是线程共有的所以在多线程访问时,需要考虑线程安全问题。
涉及堆的异常有一个就是OutofMemoryError:java heap space ,这个异常就是因为堆内存不够使用,然后会抛出这个异常,处理这个异常,一般情况会去看是否有异常的对象和数组申请,如果没有就可以调大对堆内存的大小。

5.本地方法栈

本地方法栈就是虚拟机使用到Native方法的服务,Native方法是java通过JNI直接调用到本地C/C++库,他跟java栈很像,java栈是咱们自己写的方法所执行存在的栈,而本地方法栈是java底层写的方法执行所存在的栈
计算机在运行的时候会吧,堆内存的内存地址存放到栈区,如果调用的时候会把堆区的数据复制到栈区,如果调用完毕,再去刷新到堆区。

留一个思考吧,
java设计师为什么要把基本变量放到java栈,而数组和对象放到堆区呢?

下一讲,会讲java的GC,欢迎催更

看完三件事

如果你觉得这篇内容对你挺有启发,我想邀请你帮我三个小忙:
1.点赞,让更多的人也能看到这篇内容(收藏不点赞,都是耍流氓 -_-)
2.关注我,我会不定期分享原创知识。
3.也看看其它文章

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值