方法区:

①存储被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码数据

②又称为永久代,仅对于Hotspot来讲,JRockit和IBM J9里面没有永久代的概念,1.8以后是元空间,直接使用的是外存

③垃圾回收再这一部分比较少,主要是对废弃常量的无用类的回收。

④运行时常量池也在这一部分。Class文件中除了类的版本、字段、方法、接口等描述信息以外,还有一项是常量池(Class文件常量池)用于存放编译生成的各种字面量和符号引用。 注意:运行时常量池和Class文件常量池

⑤无法分配内存时,OutOfMemory

⑥运行时常量池和Class文件常量池,Java语言并不要求常量一定在只能在编译期生成,也就是说并非预置入Class文件常量池的内容才能进方法区的运行时常量池,运行期间也可以,比如String.intern()方法;

常量池(运行时常量池和class文件常量池)

①每一项常量都是一个表

②包含Class文件中及其子结构中所有的字符串常量、类、接口名、字段名和其他常量。

③主要存放了两大类常量:字面量和符号引用。

④字面量:所有的文本字符串和声明为final的变量值

⑤符号引用:类和接口的全限定名;字段的名称和描述符;方法的名称和描述符可以理解为Class的资源仓库。

  ①几乎所有的对象实例和数组都在这分配内存  

  ②垃圾回收的主要区域,GC堆

  ③没有内存分配,没法扩展,出现outofMemoryError异常

虚拟机栈

  局部变量表 :  

    ①方法参数(paramOne)、局部变量(tempParam)、对象引用(tempObject) ,returnAddress(指向字节指令的地址)。

    ②编译阶段就确定的大小,在进入一个方法时,不会改变局部变量表的大小

    ③通过索引的方式去访问数据

  操作数栈:又一个栈,方法操作的栈。

  动态链接:

    ①每个栈帧都包含一个方法区中运行时常量池的引用,持有这个引用是为了支持方法执行过程中的动态链接。

    ②因为常量池中持有大量的符号引用,其中一部分引用在类加载期间会转化为直接引用,另一部分在运行时转化为直接引用,所以虚拟机栈的动态链接作用可以说是为了 在运行时将符号引用转化直接引用

  方法返回地址  

     ①一个方法退出有两种方式:一是遇到返回指令;二是遇到异常;

    ②当前栈帧出栈,将信息返回给上层调用的方法。

本地方法栈

  虚拟机栈类似,只不过作用与本地方法。

jvm内存分配相关知识

  一、内存分析

    Object o = new Object();

     ①涉及到三个内存区域:虚拟机栈的局部变量列表、堆、方法区

     ② o-->局部变量表

          new Object()-->实例对象放在堆中,

    堆中还必须包含此对象类型的信息(如对象类型、父类、实现接口、方法),它需要去方法区中找这部分信息。

  二、问题:对象的引用通过什么方式去定位堆中对象?

    ①句柄池和直接使用指针

    ②HotSpot使用直接使用指针定位

  三、内存溢出和测试方法

     ①Java堆:无限new 对象,保存到List中

     ②方法区: a、测试方法区中的非常量池部分 :生成大量的动态类。

           b、测试常量池:String.intern()产生不同的String实例,在List中保存。

        ③虚拟机栈 :    a、单线程:递归调用--stackOverFlowError

            b、多线程:无限创建线程

   四、符号引用(类似于java.lang.Object的符号)

    ①一组符号,任何形式的字面量,在使用时可以无歧义定位到目标即可

    ②在Class文件中以CONSTAN_Clas_info、CONSTANT_Fieldref_info、CONSTANT_Method_info等类型常量出现,

    ③符号引用与内存布局无关。

    在Java中,一个Java类将会被编译成一个Class文件,在编译过程中,Java类并不知道所引用类的实际地址,因此只能用符号引用代替,比如org.simple.People引用了org.simple.Language类,在编译时People并不知道Language类的实际内存地址,  因此只能用符号org.simple.Language(实际上是以CONSTANT_Class_info的 常量)来表示的Language的地址。

  五、直接引用(地址)

    ①直接指向目标的指针

    ②相对偏移量,指向实例变量、实例方法的都是偏移量。

    ③能够定位到目标的句柄。

    ④与虚拟机的内存布局有关

  各种虚拟机实现的内存布局不太一样,符号引用与内存布局无关,但是他们所接受的符号引用都是一样的,因为符号引用的字面量形式明确定义在了java虚拟机规范的Class文件格 式中,

  但是直接引用就有关了,同一个符号引用在不同的虚拟机上翻译出来的直接引用都不太一样,如果有了直接引用,那引用的目标必定已经被加载到内存中了

JVM(一)内存分配的更多相关文章

  1. JVM初探- 内存分配、GC原理与垃圾收集器

    JVM初探- 内存分配.GC原理与垃圾收集器 标签 : JVM JVM内存的分配与回收大致可分为如下4个步骤: 何时分配 -> 怎样分配 -> 何时回收 -> 怎样回收. 除了在概念 ...

  2. JVM总结(二):JVM的内存分配策略

    这节我们总结一下JVM中的内存分配策略.目录如下: 内存分配策略 对象优先在新生代Eden分配 大对象直接进入老年代 长期存活的对象将进入老年代 动态对象年龄判定 空间分配担保 内存分配策略 Java ...

  3. JVM的内存分配垃圾回收策略

    之前看过<深入了解Java虚拟机>感觉容易忘,今天写一篇博客加深一下印象. JVM的内存分配和垃圾回收(GC)主要发生在Java堆中.而Java堆根据对象的存活时间可以分为新生代和老年代, ...

  4. 一夜搞懂 | JVM GC&内存分配

    前言 本文已经收录到我的Github个人博客,欢迎大佬们光临寒舍: 我的GIthub博客 学习导图 一.为什么要学习GC&内存分配? 时代发展到现在,如今的内存动态分配与内存回收技术已经相当成 ...

  5. jvm的内存分配总结

    最近看了周志明版本的<深入理解Java虚拟机>第一版和第二版,写的很好,收获很多,此处总结一下.   jvm中内存划分:   如上图,一共分为五块,其中: 线程共享区域为: 1.java堆 ...

  6. JVM的内存分配与垃圾回收策略

    自动内存管理机制主要解决了两个问题:给对象分配内存以及回收分配给对象的内存. >>垃圾回收的区域 前面的笔记中整理过虚拟机运行数据区,再看一下这个区域: 注意在这个Runtime Data ...

  7. 浅谈JVM与内存分配

    一.程序内存分配 初始内存分配 当一个程序准备运行时,它首先向java虚拟机要内存,但是java虚拟机本身没有权限,它只能向操作系统申请内存,此时java虚拟机会拥有一个初始内存, 此处额外说明一下e ...

  8. jvm对象内存分配

    一.jvm简单结构图 1.jvm内存对象分配整体流程: 1.类加载子系统和方法区 类加载子系统负责从文件系统或者网络中加载Class信息,加载的类信息存放于一块称为方法区的内存空间.除了类的信息外, ...

  9. 【面试必备】小伙伴栽在了JVM的内存分配策略。。。

    周末有小伙伴留言说上周面试时被问到内存分配策略的问题,但回答的不够理想,小伙伴说之前公号里看过这一块的文章的,当时看时很清楚,也知道各个策略是干嘛的,但面试时脑子里清楚,心里很明白,但嘴里就是说不清楚 ...

  10. 认识JVM的内存分配

    当我们在JVM中运行一段程序代码,JVM初始运行的时候都会分配好Method Area(方法区)和Heap(堆),而JVM每遇到一个线程,就为其分配一个Program Counter Register ...

随机推荐

  1. 牛客暑假多校第五场 D inv

    题意:给你一个n, 接来下给你一个 [1,n] 中偶数的排列, 还有一个 [1, n] 中 奇数 按照递增的顺序排列, 现在求一个原数列, 使得偶数列排序 和 奇数列 都是原数列的一个子序列, 现在求 ...

  2. CodeForces 149E Martian Strings exkmp

    Martian Strings 题解: 对于询问串, 我们可以从前往后先跑一遍exkmp. 然后在倒过来,从后往前跑一遍exkmp. 我们就可以记录下 对于每个正向匹配来说,最左边的点在哪里. 对于每 ...

  3. POJ2084 Game of Connections 卡特兰数 关于卡特兰数经典的几个问题

    Game of Connections Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 9128   Accepted: 44 ...

  4. JSQL查询

    JSQL 其特征与原生soL语句类似,并且完全面向对象,通过类名和属性访问,而不是表名和表的属性. sql:查询的是表和表中的字段 jpql:查询的是实体类和类中的属性 查询全部   >> ...

  5. 【Offer】[49] 【丑数】

    题目描述 思路分析 测试用例 Java代码 代码链接 题目描述 我们把只包含因子2.3和5的数称作丑数( Ugly Number).求按从小到大的顺序的第1500个丑数.例如,6.8都是丑数,但14不 ...

  6. 实现 Java 本地缓存,该从这几点开始

    缓存,我相信大家对它一定不陌生,在项目中,缓存肯定是必不可少的.市面上有非常多的缓存工具,比如 Redis.Guava Cache 或者 EHcache.对于这些工具,我想大家肯定都非常熟悉,所以今天 ...

  7. Storm 系列(一)—— Storm和流处理简介

    一.Storm 1.1 简介 Storm 是一个开源的分布式实时计算框架,可以以简单.可靠的方式进行大数据流的处理.通常用于实时分析,在线机器学习.持续计算.分布式 RPC.ETL 等场景.Storm ...

  8. Java深拷贝与序列化

    对基本类型的变量进行拷贝非常简单,直接赋值给另外一个对象即可: int b = 50; int a = b; // 基本类型赋值 对于引用类型的变量(例如 String),情况稍微复杂一些,因为直接等 ...

  9. thinkphp5.1导出excel文件第三方类库运用

    若没安装请到:链接地址 https://www.phpcomposer.com/这里安装 composer 安装过的,cmd切换到项目根目录运行:composer require phpoffice/ ...

  10. IOCAutofac与ORMEntityFramwork的联系--单例模式

    在你阅读之前默认你已经理解了IOC.DI.ORM以及autofac和EF的使用 在我最近写项目的时候我在单步调试时偶然发现的一个问题 先说明我的项目使用.NET MVC 三层架构,运用IOC Auto ...