程序计数器(私有)

程序计数器:"是一个非常小的内存空间,用来保证程序依次执行",它可以看作是当前线程所执行的字节码的行号指示器 由于java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,在切出后切回的时候需要一个标识。

栈 (私有) "基本类型、运算、方法服务、指向堆内存的指针"

虚拟机栈(‘执行的是java方法服务‘) 它的生命周期与线程相同。虚拟机栈描述的是Java方法执行的线程内存模型:每个方法被执行的时候,Java虚拟机都会同步创建一个栈帧 (Stack Frame)用于存储局部变量表、操作数栈、动态连接、方法出口等信息。‘每一个方法被调用直至执行完毕的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。‘ 局部变量表: 存放了编译期可知的各种Java虚拟机基本数据类型(boolean、byte、char、short、int、float、long、double)、对象引用(reference类型, 它并不等同于对象本身,可能是一个指向对象起始地址的引用指针,也可能是指向一个代表对象的句柄或者其他与此对象相关的位置)和returnAddress类型(指向了一条字节码指令的地址)。 ‘异常抛出‘ 如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常;如果Java虚拟机栈容量可以动态扩展,‘其实HotSpot虚拟机的栈容量是不可以动态扩展的‘ 当栈扩展时无法申请到足够的内存会抛出OutOfMemoryError异常。 本地方法栈(‘执行的是虚拟机用到的native方法服务‘) 一个native方法就是一个Java调用非Java代码的接口。 本地方法栈也会在栈深度溢出或者栈扩展失败时分别抛出StackOverflowError和OutOfMemoryError异常。

堆 (共享)(-Xmx -Xms)("是垃圾收集器管理的主要区域。")

"堆内存用于存放由new创建的对象和数组,集合等,String new 出来和不是new出来的存储地方不同。"保存所有引用数据的真实信息;存放对象实例,几乎所有的对象都是存在堆中的,被‘所有的线程共享。‘ 包括原始类型的封装类(如Byte、Integer、Long等等),‘不管对象是属于一个成员变量还是方法中的本地变量,它都会被存储在堆区。‘ 新生代和老年代 其中新生带存放新生的对象或者年龄不大的对象,老年代则存放老年对象。   新生代分为eden区、s0区、s1区,"s0和s1也被称为from和to区域,他们是两块大小相等并且可以互相角色的空间。"   绝大多数情况下,对象首先分配在eden区,在新生代回收后,如果对象还存活,则进入s0或s1区,之后每经过一次   新生代回收,如果对象存活则它的年龄就加1,对象达到一定的年龄后,则进入老年代。

堆栈的存储

1、基础数据类型直接在栈空间分配;

2、方法的形式参数,直接在栈空间分配,当方法调用完成后从栈空间回收;

3、引用数据类型,需要用 new 来创建,既在栈空间分配一个地址空间,又在堆空间分配对象的类变量;

4、方法的引用参数,在栈空间分配一个地址空间,并指向堆空间的对象区,当方法调用完后从栈空间回收;

5、局部变量 new 出来时,在栈空间和堆空间中分配空间,当局部变量生命周期结束后,栈空间立刻被回收,堆空间区域等待 GC 回收;

6、方法调用时传入的实际参数,先在栈空间分配,在方法调用完成后从栈空间释放;

7、字符串常量在 DATA 区域分配 , this 在堆空间分配;

8、数组在栈空间分配数组名称, 在堆空间分配数组实际的大小!

9.‘Static类型的变量以及类本身相关信息都会随着类本身存储在堆区。

10.一个本地变量也有可能是一个对象的引用,这种情况下,这个本地引用会被存储到栈中,但是对象本身仍然存储在堆区。

11.对于一个对象的成员变量,不管它是原始类型还是包装类型,都会被存储到堆区。

12.堆中的对象可以被多线程共享。如果一个线程获得一个对象的应用,它便可访问这个对象的成员变量。如果两个线程同时调用了同一个对象的同一个方法, 那么这两个线程便可同时访问这个对象的成员变量,但是对于本地变量,每个线程都会拷贝一份到自己的线程栈中。

方法区(共享)(描述为堆的一个逻辑部分)"所以定义的方法的信息都保存方法区中"

用于存储已被虚拟机‘加载的类信息、常量、静态变量、即时编译器编译后的代码缓存等数据。‘ 也就是所有编译器能够被确定,能够被快速查找的内容都存放在这里,它像数组一样通过索引访问,就是专门用来做查找的" ‘元空间(替代永久代)‘ 元空间并不在虚拟机中,而是"使用本地内存"。 -XX:MetaspaceSize,初始空间大小,达到该值就会触发垃圾收集进行类型卸载,同时GC会对该值进行调整:如果释放了大量的空间,就适当降低该值; 如果释放了很少的空间,那么在不超过MaxMetaspaceSize时,适当提高该值。 -XX:MaxMetaspaceSize,最大空间,默认是没有限制的。 存储的是每个class的信息: 1.类加载器引用(classLoader) 2.运行时常量池(是方法区的一部分,用于存储编译器生成的各种字面量和符号引用。) 所有常量、字段引用、方法引用、属性 3.字段数据 每个方法的名字、类型(如类的全路径名、类型或接口) 、修饰符(如public、abstract、final)、属性 4.方法数据 每个方法的名字、返回类型、参数类型(按顺序)、修饰符、属性 5.方法代码 每个方法的字节码、操作数栈大小、局部变量大小、局部变量表、异常表和每个异常处理的开始位置、结 束位置、代码处理在程序计数器中的偏移地址、被捕获的异常类的常量池索引 为什么要使用元空间能代替永久代 1、字符串存在永久代中,容易出现性能问题和内存溢出。   2、类及方法的信息等比较难确定其大小,因此对于永久代的大小指定比较困难,太小容易出现永久代溢出,太大则容易导致老年代溢出。   3、永久代会为 GC 带来不必要的复杂度,并且回收效率偏低。 方法区无法满足新的内存分配需求时,将抛出OutOfMemoryError异常。

运行时常量池

有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池表(Constant Pool Table),用于存放编译期生成的各种字面量与符号引用,‘总之就是装载class文件。‘ 这部分内容将在类加载后存放到方法区的运行时常量池中。

常量池

常量池主要可以分为以下几种: (1)静态常量池:即*.class文件中的常量池,class文件中的常量池不仅仅包含字符串/数字这些字面量,还包含类、方法的信息,占用class文件绝大部分空间。 这种常量池主要用于存放两大类常量:字面量和符号引用量,字面量相当于Java语言层面常量的概念,如文本字符串,声明为final的常量值等;符号引用则属于编译原理    方面的概念,包括了如下三种类型的常量:类和接口的全限定名、字段名称描述符、方法名称描述符。         类的加载过程中的链接部分的解析步骤就是把符号引用替换为直接引用,即把那些描述符(名字)替换为能直接定位到字段、方法的引用或句柄(地址)。 (2)运行时常量池:虚拟机会将各个class文件中的常量池载入到运行时常量池中,即编译期间生成的字面量、符号引用,总之就是装载class文件。 字符串常量池 :字符串常量池可以理解为运行时常量池分出来的部分。加载时,对于class的静态常量池,如果字符串会被装到字符串常量池中。 整型常量池:Integer,类似字符串常量池,可以理解为运行时常量池分出来的。加载时,对于class的静态常量池装的东西,如果是整型会被装到整型常量池中。                类似的还有Character、Long等等常量池(基本数据类型没有哦)。。。

直接内存

不在虚拟机中,称作堆外内存

java字面量 方法区_(一)java的内存模型相关推荐

  1. java中的方法求和_在Java中模拟求和类型的巧妙解决方法

    java中的方法求和 在继续阅读实际文章之前,我想感谢令人敬畏的Javaslang库的作者Daniel Dietrich ,他在我面前有了这个主意: @lukaseder尝试使用静态方法<T,T ...

  2. 46栈内存溢出、内存区域(程序计数器、Java 虚拟机栈、本地方法栈、Java 堆、方法区、直接内存、内存溢出)与内存溢出(对象实例化分析)

    46.什么情况下会发生栈内存溢出 46.1.Java 内存区域与内存溢出 46.1.1.内存区域 46.1.1.1.程序计数器 46.1.1.2.Java 虚拟机栈 46.1.1.3.本地方法栈 46 ...

  3. 从几个sample来学习Java堆,方法区,Java栈和本地方法栈

    2019独角兽企业重金招聘Python工程师标准>>> 最近在看<深入理解Java虚拟机>,书中给了几个例子,比较好的说明了几种OOM(OutOfMemory)产生的过程 ...

  4. Java: Java字面量、 变量和常量

    Java字面量. 变量和常量 先给出一段小代码,如下: int a = 10; //a为变量,10为字面量 final int b = 10; //b为常量,10为字面量 static str = & ...

  5. java 字面量_Java字面量

    Java字面量 本章节目标: 理解变量本质是什么,在开发中有什么用?变量三要素是什么?怎么声明变量?怎么给变量赋值?变量是如何分类的?变量的作用域? 知识框架: Java字面量 字面量就是数据/数值, ...

  6. java 取栈顶元素_《Java实战之内存模型》详解篇

    内存是非常重要的系统资源,是硬盘和CPU的中间仓库及桥梁,承载着操作系统和应用程序的实时运行 JVM内存布局规定了Java在运行过程中内存申请.分配.管理的策略,保证了JVM的高效稳定运行 不同的JV ...

  7. 常量池在堆还是方法区_第九章_方法区

    方法区 栈.堆.方法区的交互关系 这次所讲述的是运行时数据区的最后一个部分--方法区 从线程共享与否的角度来看 ThreadLocal:如何保证多个线程在并发环境下的安全性?典型应用就是数据库连接管理 ...

  8. 为啥JAVA虚拟机不开发系统_理解Java虚拟机体系结构

    1 概述 众所周知,Java支持平台无关性.安全性和网络移动性.而Java平台由Java虚拟机和Java核心类所构成,它为纯Java程序提供了统一的编程接口,而不管下层操作系统是什么.正是得益于Jav ...

  9. 【源码+图片素材】Java王者荣耀游戏开发_开发Java游戏项目【王者荣耀】1天搞定!!!腾讯游戏_Java课程设计_Java实战项目_Java初级项目

    王者荣耀是当下热门手游之一,小伙伴们是否想过如何制作一款属于自己的王者荣耀游戏呢? 本课程讲解了一个王者荣耀游戏的详细编写流程,即使你是刚入门Java的新手,只要你简单掌握了该游戏所需要的JavaSE ...

最新文章

  1. android edittext标签,TagEditText,类似微博标签的文本控件
  2. 将某个目录上的Excel表,导入到数据库中.sql
  3. 曾经安全难为智 除却山石不是云——山石网科举办2016年度金融用户峰会
  4. 学习笔记之APACHE ANT
  5. 架构可视化支撑系统演进探索
  6. 微软网站提供的8本英文原版书电子版
  7. DatagridView 跳转并显示特定的行
  8. 北风网Winform实战开发上海某房产中介管理系统视频教程
  9. C# OpenCV OpenCVSharp应用实例--LCD屏幕脏污检测
  10. PCB_问题记录_QT(1)引用gdiplus.h、Gdiplus.lib 报错
  11. 最好用的WIN7WIN10激活工具
  12. 了解React Native组件,模板和工具
  13. 离散数学1-数理逻辑的基本概念
  14. 边云协同的优点_关于边缘计算和边云协同,看这一篇就够了
  15. 使用GerberTools的Gerber Panelizer工具进行gerber文件拼板的方法
  16. 电商数仓:用户行为数据仓库(一)数据仓库建设和技术选型
  17. 区块链论文8(ContractGuard分析写作手法)
  18. Unity3D WASD和方向键控制多个角色
  19. 经典中国黑客站点推荐
  20. 对抗神经网络CycleGAN论文解读

热门文章

  1. vue - .babelrc
  2. 服务器-番外篇-搭建samba共享
  3. linux重启和关机命令
  4. 【xml】python的lxml库使用
  5. Visual Studio 2010 -新特性,但我要的比这个更多!
  6. 如何绘制类似仓库的平面位置图
  7. 【MM模块】Cycle Counting 周期盘点
  8. PP: 混合生产方式(MTO与MTS为例)
  9. 取成本中心-生产订单
  10. SAP ABAP MARD和MARDH计算逻辑