转载请注明作者与出处

程序计数器

线程私有

因为物理cpu并不多,所以jvm是对java里面的线程进行不停的切换执行,因为切换的执行速度太快,所以我们看到是并发执行。所以jvm在切换线程执行后,如果要切换回原来的线程,它需要记住这个线程的执行位置,下一条指令是什么。所以每一个线程都有一个独立的程序计数器,它是线程私有的。

数据内容

程序计数器保存了每个对象的引用数量,但是也不仅仅是对象的引用,它保存了一个线程中一系列需要执行的字节码指令的内存地址,包括循环,异常等

native方法

如果当前正在执行的是native方法,那么它在程序计数器里面的值是空(undefined)。

java栈

线程私有

java栈保存的是执行每一个方法的内容,所以每执行一个方法,都会创建一个栈帧(StackFrame),保存局部变量,操作数栈,动态链接,方法的进出信息等,直到一个方法调用完成,就意味着一个栈帧从进去到出来的过程,所以它也是线程私有的。

数据内容

java栈帧中,保存了当前局部的基本数据类型(boolean,byte,char,short,int,float,long,double),以及对象引用

对象引用,这里指的是定义的那些对象,但是值得注意的是,这里保存的是引用,而不是具体的内容,当我们new一个对象时,jvm会把创建的引用放在栈里面,但是对象本身,是存在堆里面的,而引用只是保存了对象在堆里面的内存地址,这是因为栈内存很小,但是栈读取数据快,所以存储了引用,而我们开辟出来的对象,或者申请的内存是放在堆里面的。

局部变量所需要的内存,在一开始就是确定的,jvm会按照变量类型计算。因为当进入一个栈帧时,所需要的内存是确定的,直到出栈,这里面的内存不会发生任何变化。

栈异常

jvm中对于栈规则了两种异常。

  1. 当java类中的方法进入次数太多时,会导致栈的层次越来越深,如果请求的栈深度,超出了jvm虚拟机所允许的深度,就会抛出StackOverflowError异常。(当前绝大部分虚拟机都是可以动态调整栈深度的,所以一般不会出现这个问题,但是也不排除,因为jvm规范中也允许固定长度的栈深度)
  2. 另一方面,如果扩展栈深度时,无法申请到足够的内存,就会抛出OutOfMemoryError异常。

所以当我们遍历文件夹的时候,最好不要用递归,因为可能出现栈溢出的异常。

本地方法栈

本地方法栈所起的作用和java栈的作用几乎一致,只不过本地方法栈中,保存的是native方法的栈信息,但是虚拟机规范中,对于native方法的实现语言,实现类型,数据结构并没有明确规定,各种虚拟机可以自由实现它,比如Sun HotSpot虚拟机就把java栈和本地方法栈合二为一了。

本地方法栈也有着StackOverflowErrorOutOfMemoryError

java堆

堆是所有线程共享的,它是jvm管理内存的最大的一块区域,也是java程序员所能操控的内存区域。

数据内容

java程序员所能操控的内存,虽然对于程序员来说没有感知,但实际上全部是在堆里面操作,比如我们new出来的对象,以及数组,其实都是存放在堆内存里面的。

垃圾回收

java堆是gc回收内存的主要区域,因为现在的内存回收算法基本都是采用分代算法,所以还可以分为新生代和老生代,这样的分配是为了更快的找出需要回收的内存,提高gc效率。甚至还可以更往细分Eden,From Survivor,To Survivor等。

空间大小

java堆里面的内存可以是物理上不连续的内存,只要是逻辑上连续就可以,一般主流虚拟机,都是可以在启动的时候,根据启动参数指定内存大小(-Xms -Xmx),如果在使用内存时,jvm无法再申请新的堆内存,就会抛出OutOfMemoryError异常。

方法区

方法区是所有线程共享的区域,方法区也叫永久代,因为它永远不会被gc回收。

数据内容

用于存储虚拟机加载的类信息,常量,静态变量等数据,这些数据是在类加载器加载时候完成的,所以虽然说new出来的对象是存在堆里面的,但是如果这个对象是常量,那么在类加载器加载这个类的时候,就会把这些静态变量存储到方法区里面去。

异常信息

同样的,方法区的内存无法满足内存的根本需求时,抛出OutOfMemoryError异常

堆外内存(直接内存)

堆外内存是一块独立的内存,值得注意的是,它是由java程序员完全操纵的一个内存,意味着,程序员需要显式的申请内存,以及手动释放内存,因为它不由gc管理。

它的优点是因为直接操作内存,在某些应用场景中,可以避免内存的复制,以及回收再创建,可以提升内存的利用率。

它的缺点就是需要手动释放内存,而不是交给gc来处理,所以使用不当,很容易抛出OutOfMemoryError异常。

堆外内存不受到堆内存的限制,也就是不受到-Xmx的限制,但是还是受到物理内存的限制,如果超出物理内存,就就会抛出OutOfMemoryError

了解java内存模型,看这里就够了的更多相关文章

  1. 【JVM】JVM内存结构 VS Java内存模型 VS Java对象模型

    原文:JVM内存结构 VS Java内存模型 VS Java对象模型 Java作为一种面向对象的,跨平台语言,其对象.内存等一直是比较难的知识点.而且很多概念的名称看起来又那么相似,很多人会傻傻分不清 ...

  2. 【转】JVM内存结构 VS Java内存模型 VS Java对象模型

    JVM内存结构 我们都知道,Java代码是要运行在虚拟机上的,而虚拟机在执行Java程序的过程中会把所管理的内存划分为若干个不同的数据区域,这些区域都有各自的用途. 其中有些区域随着虚拟机进程的启动而 ...

  3. 区分 JVM 内存结构、 Java 内存模型 以及 Java 对象模型 三个概念

    本文由 简悦 SimpRead 转码, 原文地址 https://www.toutiao.com/i6732361325244056072/ 作者:Hollis 来源:公众号Hollis Java 作 ...

  4. Java内存模型、JVM内存结构和Java对象模型

    JVM内存结构 我们都知道,Java代码是要运行在虚拟机上的,而虚拟机在执行Java程序的过程中会把所管理的内存划分为若干个不同的数据区域,这些区域都有各自的用途.其中有些区域随着虚拟机进程的启动而存 ...

  5. [转帖]JVM内存结构 VS Java内存模型 VS Java对象模型

    JVM内存结构 VS Java内存模型 VS Java对象模型 https://www.hollischuang.com/archives/2509 Java作为一种面向对象的,跨平台语言,其对象.内 ...

  6. 了解Java内存模型,看完这一篇就够了

    前言(此文草稿是年前写的,但由于杂事甚多一直未完善好.清明假无事,便收收尾发布了) 年关将近,个人工作学习怠惰了不少.两年前刚做开发的时候,信心满满想看看一个人通过自己的努力,最终能达到一个什么样的高 ...

  7. 别再问什么是Java内存模型了,看这里!

    网上有很多关于Java内存模型的文章,在<深入理解Java虚拟机>和<Java并发编程的艺术>等书中也都有关于这个知识点的介绍.但是,很多人读完之后还是搞不清楚,甚至有的人说自 ...

  8. Java 内存模型 ,一篇就够了!

    Java 虚拟机   我们都知道 Java 语言的可以跨平台的,这其中的核心是因为存在 Java 虚拟机这个玩意.虚拟机,顾名思义就是虚拟的机器,这不是真实存在的硬件,但是却可以和不同的底层平台进行交 ...

  9. 02 | Java内存模型:看Java如何解决可见性和有序性问题

    什么是 Java 内存模型? 导致可见性的原因是缓存,导致有序性的原因是编译优化,那解决可见性. 有序性最直接的办法就是禁用缓存和编译优化,但是这样问题虽然解决了,我们程序的性能可就堪忧了.   合理 ...

  10. 一图看懂java内存模型

    熟话说一张好图胜过千言万语,在此便将java内存模型重新整理了一次,将细节标注到图中献给需要的同学:

随机推荐

  1. 【ARC079F】Namori Grundy

    Description 题目链接 大意:给一张基环外向树.要求给每一个点确定一个值,其值为所有后继点的\(\text{mex}\).求是否存在确定权值方案. Solution 首先,对于叶子节点,其权 ...

  2. debian9部署jenkins

    这里记录两种部署方式,一种是通过包管理工具直接安装,另一种是用tomcat作为web容器运行jenkins.个人倾向第一种,部署简单,而且维护起来方便很多. 用包管理工具aptitude部署jenki ...

  3. 生成器python

    一.列表生成式 需求:看列表[0, 1, 2, 3, 4, 5, 6, 7, 8, 9],我要求你把列表里的每个值加1,你怎么实现?你可能会想到2种方式 >>> a [0, 1, 2 ...

  4. Python 内置变量

    Python 隐藏变量 __doc__ # 表示本文件的注释__file__ # 表示本文件的路径 __package__ # 导入的py文件所在的文件夹路径__cached__ # 导入文件的缓存_ ...

  5. python 爬虫 scrapy1_官网教程

    Python爬虫视频教程零基础小白到scrapy爬虫高手-轻松入门 https://item.taobao.com/item.htm?spm=a1z38n.10677092.0.0.482434a6E ...

  6. Hadoop基础-MapReduce的Combiner用法案例

    Hadoop基础-MapReduce的Combiner用法案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.编写年度最高气温统计 如上图说所示:有一个temp的文件,里面存放 ...

  7. 说说Cookie和Session

    Session和Cookie在网站开发中是用来保存用户与后端服务器的交互状态.它们有各自的缺点和优点.而且,他们的优点和应用场景是对立的.   Cookie 完整地描述:当一个用户通过HTTP访问一个 ...

  8. Spark记录-Scala循环语句

    Scala while循环语句 当给定条件为真时,while循环重复一个语句或一组语句.它在执行循环体之前测试条件状态. 只要给定的条件为真,while循环语句重复执行目标语句. object Dem ...

  9. python学习笔记5--加密模块hashlib

    import hashlib # md5 ybm_pwd='yuanbapqingsdfs234FF234HF@F' # m = hashlib.md5() # bytes_ybq = ybm_pwd ...

  10. css中实现ul两端的li对齐外面边缘

    其实就是设置ul的宽度大一些就好