转载请注明作者与出处

程序计数器

线程私有

因为物理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. (转)Maven学习总结(四)——Maven核心概念

    孤傲苍狼只为成功找方法,不为失败找借口! Maven学习总结(四)——Maven核心概念 一.Maven坐标 1.1.什么是坐标? 在平面几何中坐标(x,y)可以标识平面中唯一的一点. 1.2.Mav ...

  2. Eclipse 报 "The builder launch configuration could not be found" 错误

    Eclipse 报 "The builder launch configuration could not be found" 错误的解决办法 标签: eclipseEclipse ...

  3. 调试技巧 ------ printf 的使用技巧

    编译器宏:__FUNCTION__,__FILE__,__LINE__ #define __debug #ifdef __debug //#define debug(format,...) print ...

  4. Python 基础数据类型之set

    set是一个无序且不重复的元素集合,相当于字典的键,不重复,不可变 一.set变量初始化 A = set() #注意在创建空集合的时候只能使用s=set(),因为s={}创建的是空字典 B = {&q ...

  5. Java基础-处理json字符串解析案例

    Java基础-处理json字符串解析案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 作为一名开发人员,想必大家或多或少都有接触到XML文件,XML全称为“extensible ...

  6. Object和泛型

    这俩东东呢实现的效果是一样的,但是它们俩的效率不一样,原理也不一样.直接说结论吧,泛型比Object好用,效率高.因为Object有一个装箱和拆箱的过程,倘若是很多的数据那效率就低到不行了,而泛型没有 ...

  7. VS2010 设置main函数输入参数

    main函数的argc.argv参数. 英文版:菜单Project -> Properties -> Configuration Properties -> Debugging在Co ...

  8. 贪心算法:Codevs 1044 拦截导弹

    ---恢复内容开始--- #include <iostream> #include <cstdio> #include <cstdlib> #include < ...

  9. artTemplate

    1.http://www.cnblogs.com/jiqiyoudu/p/4588042.html

  10. 网页中创建音频、视频和Flash等多媒体:object元素

    <object>元素:它主要用于定义网页中的多媒体,比如音频.视频.Java applets.PDF.ActiveX和Flash.Object标签是成对出现的,在object标签内可以使用 ...