java的内存结构:

  在并发编程中,多个线程之间采用共享内存模型来实现多线程之间的信息交换和数据同步.线程之间通过共享程序公共的状态,通过读-写内存中公共状态的方式来进行隐式的通信.同步指的是程序在控制多个线程之间执行程序的相对顺序的机制.

java内存结构图:

  

java 运行时数据区:

  1,PC寄存器/程序计数器:

    程序计数器本身是一个数据结构,用于保存当前正在执行的程序内存地址,由于java是支持多线程执行,所以程序执行的轨迹不可能一直都是线性执行.当多个线程交叉执行时,被中断的程序当前执行到哪个内存地址必然要保存下来,以便用于程序的恢复.为了线程切换后能恢复到正确的执行位置,每个线程都需要有一个独立的程序计数器,各个线程之间计数器互不影响,独立存储,我们称这类内存区域为"线程私有"的内存,是线程安全的.有点类似"ThreadLocal"类.

  2,java栈Java Stack

    java栈总是与线程关联起来,每当创建一个线程,JVM就会为该线程创建对应的java栈,在这个java栈中又会包含多个栈帧(Stack Frame),这些栈帧是与每个方法关联起来的,每运行一个方法就创建一个栈帧,每个栈帧会含有一些局部变量、操作栈和方法返回值等信息.每当一个方法执行完成时,该栈帧就会弹出栈帧的元素作为这个方法的返回值,并且清除这个栈帧,java栈的栈顶的栈帧就是当前正在执行的活动栈,也就是当前正在执行的方法,PC寄存器也会指向该地址.只有这个活动的栈帧的本地变量可以被操作栈使用,当这个栈帧中调用另外一个方法时,与之对应的一个新栈帧被创建,这个新创建的栈帧被放到java栈的栈顶,变为当前的活动栈.同样现在只有这个栈的本地变量才能被使用,当这个栈中所有指令都完成时,这个栈帧被移除java栈,刚才的那个栈帧变为活动栈帧,前面栈帧的返回值变为这个栈帧的操作栈的一个操作数.

    java栈是与线程对应起来,java栈数据不是线程共有的,所有不需要关系数据不一致性,也不会出现同步锁的问题.对这个区域规定有两种异常状况:

      a,如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常;
      b,如果虚拟机可以动态扩展,如果扩展时无法申请到足够的内存,就会抛出OutOfMemoryError异常.

    在虚拟机中可以使用-Xss参数来设置栈的大小(-Xss:设置每个线程的堆栈大小)

  3,java 堆Head:

    堆是JVM所管理最大的一块内存空间,是被所有java线程所共享的,不是线程安全的,在JVM启动时创建.堆是存储java对象的地方,所有的对象实例以及数组都要在堆上分配.java堆是GC管理的主要区域,从内存回收的角度来看,由于现在GC基本都是采用分代收集算法,所以java堆还可以分为:新生代和老年代,新生代又可以分为:一个Eden空间和两个Survivor空间.

    堆大小设置:

      通过-Xmx与-Xms参数控制堆的最大和最小内存空间.新生代+老年代+持久代=JVM内存大小,持久代一般固定为64M,所以增大年轻代后,将会减小年老代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。

  4,方法区Method Area:

    方法区存放了要加载的类信息(名称、修饰符、权限等)、类中的静态常量、类中定义为final类型的常量、类中的field信息、类中的方法信息,当在程序中通过Class对象的getName.isInterface等方法来获取信息时,这些数据都来源于方法区.方法区是被java线程所共享的,不会被垃圾回收器GC频繁回收,它存储的信息相对比较稳定,在一定的条件下会被GC回收,当方法区要使用的内存超过其设置的大小时,会抛出OutOfMemoryError的错误信息.方法区也是堆中的一部分,就是我们通常所说的java堆中的永久区(Permanet Generation),大小可以通过参数来设置,通过-XX:PermSize指定初始值,-XX:MaxPermSize指定最大值.

  5,本地方法栈Native Method Stack

    本地方法栈和java栈发挥的作用非常相似,区别不过是java栈为JVM执行java方法服务,而本地方法栈为JVM执行Native方法服务.本地方法栈也会抛出StackOverflowError和OutOfMemoryError异常.

转载于:https://www.cnblogs.com/fanchengshijin/p/10100681.html

潜入java内存结构相关推荐

  1. Java内存结构与垃圾回收机制算法分析

    什么是HotSpot VM 提起HotSpot VM,相信所有Java程序员都知道,它是Sun JDK和OpenJDK中所带的虚拟机,也是目前使用范围最广的Java虚拟机. 但不一定所有人都知道的是, ...

  2. JAVA内存结构解析

    原文链接:http://tryenough.com/java-memory-structure 更多:http://tryenough.com/type-android Java内存结构大体示意图: ...

  3. java 虚拟机 Java内存结构 JVM垃圾回收机制算法

    什么是HotSpot VM 提起HotSpot VM,相信所有Java程序员都知道,它是Sun JDK和OpenJDK中所带的虚拟机,也是目前使用范围最广的Java虚拟机. 但不一定所有人都知道的是, ...

  4. Java内存模型和Java内存结构精读

    以前看过很多遍JVM相关知识的文章,无非都是直接来张图片开搞,一来就甩张图片上来,这是方法区,这是堆,这是线程独享的一堆堆的概念,看得真的是头大,死记硬背也记不下来,更别说理解了. 最近一段时间在看j ...

  5. 【Java千问】你了解Java内存结构么(Java7、8、9内存结构的区别)

    Java内存结构是每个java程序员必须掌握理解的,这是Java的核心基础,对我们编写代码特别是并发编程时有很大帮助.由于Java程序是交由JVM执行的,所以我们在谈Java内存区域划分的时候事实上是 ...

  6. 1、Java 内存结构

    1.Java 内存结构 1.1.Java 内存模型 堆 由线程共享,存放 new 出来的对象,是垃圾回收器的主要工作区域. 栈 线程私有,分为 Java 虚拟机栈和本地方法栈,存放局部变量表.操作栈. ...

  7. Java架构学习(十二)java内存结构新生代老年代JVM参数调优堆内存参数配置解决堆栈溢出

    JVM参数调优与垃圾回收机制 一.java内存结构 Java内存模型:是多线程里面的,jmm与线程可见性有关 Java内存结构:是JVM虚拟机存储空间. Java内存结构图 Java内存机构分为:方法 ...

  8. Java内存结构与Java内存模型

    Java内存结构.内存模型.对象模型这几个概念经常会被混为一谈.理论知识容易忘写下来帮助记忆,方便以后查看. 1.Java内存结构 Java内存结构其实说的是JVM在运行时内存区域的划分,是根据Jav ...

  9. Java内存结构和模型

    jvm的体系结构分为五个结构.方法区,堆,虚拟机栈,本地方法区,程序计数器PC.其中方法区和堆是所有线程共享的,每一个线程都有一个程序计数器 a.寄存器:这个概念比较模棱两可,网上查了一下一种说法是J ...

最新文章

  1. windows 平台使用 VS2017 编译 libevent 源码
  2. Spring MVC重定向和转发及异常处理
  3. 安装中文语言包会导致 Troubleshoot Compatibility 失败
  4. ADO.NET开发总结(学习笔记)
  5. matlab五子棋_应用 | 五子棋游戏——没人能在我的程序里打败我
  6. python使用joblib多进程执行for循环
  7. JVM运行时内存概念-堆栈及新生代、老年代、持久代
  8. 哪里有c语言在线编程题,在线求C语言编程题答案。。。
  9. python的输出语句_python 中简单的输出语句
  10. Windows网络编程获得本机IP地址
  11. Python爬虫下载美女图片(不同网站不同方法)
  12. 深度学习的视觉跟踪:一个全面的调查
  13. 时间轴app哪个好?可以记录自己过去经历的时间轴便签
  14. DiskGenius系统迁移(更换硬盘系统对拷)
  15. 【中国数据创新琅琊榜】萨纳斯大数据实验室,高校大数据教学、实训、人才培养的最佳选择!
  16. 基于单片机的超市储物柜设计_基于51单片机的超市自动储物柜的设计,求大佬指点?...
  17. vue图片查看器,支持放大 缩小 还原
  18. “硬解码”与“软解码”的区别
  19. Redis集群(读写分离、哨兵机制、Cluster集群)
  20. 人生苦短,必须性感!

热门文章

  1. netbean创建jsf项目
  2. Maxon Cinema 4D Studio S22.114中文版
  3. 完整的中英文词频统计
  4. Codeforces937D Sleepy Game
  5. 算法入门经典第六章 例题6-8 树
  6. 基于ANN的6种调制信号自动调制识别(2ASK、4ASK、2FSK、4FSK、2PSK、4PSK)
  7. postman的使用方法详解!最全面的教程
  8. iptables一次性封多个ip,使用ipset 工具
  9. [转]开发者需要了解的WebKit(mark)
  10. pyxml for python 2.6 死而复生