转载请注明作者与出处

程序计数器

线程私有

因为物理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. luogu2375 动物园 (kmp)

    首先求出fail数组,如果没有不重叠的限制的话,我们可以在求fail的时候递推出个数cnt[i]=cnt[fail[i]]+1(这个cnt是算上自己本身==自己本身的) 然后如果是要求不重叠的话,就是 ...

  2. 关于xmlhttp会使用ie的缓存的问题及解决

    在浏览器(如:IE)的客户端使用xmlhttp读取网络资源的时候,需要考虑到浏览器本地缓存的问题. 如果希望读取的数据是实时更新的,也就是不想从本地缓存中读取数据,我之前常用的方法是在请求网址后面加一 ...

  3. spring BasicDataSource 数据源配置 sqlserver数据库 oracle数据库 mysql数据jdbc配置

    spring BasicDataSource 数据源配置 sqlserver数据库 oracle数据库 mysql数据jdbc配置 jdbc.properties 文件信息如下: ---------- ...

  4. openstack项目【day23】:openstack组件介绍

    本节内容 openstack介绍 openstack项目(服务名是项目名的别名) openstack运行流程 openstack各组件详解 一:openstack介绍             open ...

  5. [iOS]Xcode处理过时方法的警告

    ####强迫症的福利, 有的时候, 我们特别讨厌Xcode中的代码警告, 以下就是遇到各种警告的时候的处理方法:(后续会一直更新) 产生警告的原因: 某些方法废弃了, 会产生警告! 样式: 处理方法: ...

  6. 【洛谷P2420】让我们异或吧

    题目描述 异或是一种神奇的运算,大部分人把它总结成不进位加法. 在生活中…xor运算也很常见.比如,对于一个问题的回答,是为1,否为0.那么: (A是否是男生 )xor( B是否是男生)=A和B是否能 ...

  7. 第7月第26天 iOS httpserver

    1. cocoahttpserver 1)httpserver [httpServer start:&error] 2)HTTPConnection [newConnection start] ...

  8. 阿里云配置 https 证书

    阿里云配置中心 https://yundun.console.aliyun.com/?p=cas#/cas/home 证书审核通过后复制到 ecs scp /path/filename usernam ...

  9. python_ssh连接

    首先下载paramikopip install paramiko查看并启动ssh服务service ssh status 添加用户:useradd -d /home/zet zetpasswd zet ...

  10. Explain EV in /proc/bus/input/devices data【转】

    转自:https://unix.stackexchange.com/questions/74903/explain-ev-in-proc-bus-input-devices-data It repre ...