1.课程概要

(1)Java虚拟机和Java内存区域概述

(2)Java虚拟机栈和本地方法栈

(3)Java堆

(4)方法区和运行时常量池

(5)直接内存

2.Java虚拟机运行时数据区

运行时数据区的划分(5):

(1)Java虚拟机栈

(2)本地方法栈

(3)程序计数器

(4)Java堆

(5)方法区(包含运行时常量池)

程序计数器(Program counter Register)

1.是一块较小的内存空间,它的作用可以看作是当前线程所执行的字节码的行号指示器

2.如果线程正在执行的是一个java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;

如果正在执行的是Native方法,这个计数器值则为空

3.此内存区域是唯一一个在Java虚拟机规范中没有规定任何OutOfMemoreyError情况的区域

Java虚拟机栈和本地方法栈

Java虚拟机栈的概念和特征

(1)线程私有

(2)后进先出栈

(3)存储栈帧,支持java方法的调用、执行和退出

(4)可能出现OutOfMemoryError异常和StackOverflowError异常、

栈帧的概念和特征

1)Java虚拟机栈中存储的内容,它被用来存储数据和部分过程的数据结构,

同事也被用来处理动态连接,方法返回值和异常分派

2)一个完整的栈帧包含:局部变量表、操作数栈、动态连接信息、方法正常完成和

异常完成信息

局部变量表概念和特征

1)由若该个Slot组成,长度由编译期决定

2)单个Slot可以存储一个类型为boolean、byte、char、short、float、reference

和returnAddress 的数据,两个Slot可以存储一个类型为long或者double的数据

3)局部变量表用于方法间参数传递,以及方法执行过程中存放基础数据类型的值

和对象的引用

操作数栈的概念和特征

1)是一个后进先出栈,由若干个Entry组成,长度由编译期决定

2)单个Entry即可以存储一个Java虚拟机中国定义的任意数据类型的值,包括

long和double类型,但是存储long和double类型的Entry深度为2,其他类型的深度为1

3)在方法执行过程中,栈帧用于存储计算阐述和计算结果;在方法调用时,操作数栈用来准备调用方法的参数以及接收方法返回结果

本地方法栈的概念和特征

(1)线程私有

(2)作用是支撑Native方法的调用、执行和退出

(3)后进先出栈

(4)可能出现OutOfMemoryError异常和StackOverflowError异常

(5)有一些虚拟机(如HotSpot)将Java虚拟栈和本地方法栈合并实现

Java堆

Java堆的特征

1.给所有线程共享的内存区域

2.通常是Java虚拟机中最大的一块内存区域

3.作用是作为Java对象的主要存储区域

4.JVMS明确要求该区域需要实现自动内存管理,即常说的GC,但是不限制采用哪种算法和技术去实现

(新生代,老年代,永久代)分带算法

5.可能出现OutOfMemoryError异常

从栈到堆的关联过程

方法区(永久代)和运行时常量池

方法区的特点

1.全局共享

2.作用是存取Java类的结构信息(常量,静态变量,方法,字段等)

3.JVMS不要求该区域实现自动内存管理,但是商用Java虚拟机都能够自动管理该区域的内存

4.可能出现OutOfMemoryError

运行时常量池的特征(是方法区中的一部分)

1.全局共享

2.是方法区的一部分

3.作用是存取Java类文件常量池中的符号信息

4.可能出现OutOfMemoryError异常

HotSpot方法区实现的变迁

永久代与方法区

1.在JDK1.2~JDK6,HotSpot使用永久代实现方法区

2.在JDK7开始,HotSpot开始了移除永久代的计划

1)符号表被移动到Native Heap中

2)字符创常量和类的静态引用被移动到Java Heap中

3.在JDK8开始,永久代已经被元空间(Metaspace)所代替

直接内存

直接内存的概念和特征

1.并非JVMS定义的标准Java运行时内存区域

2.随JDK1.4中加入NIO被引入,目的是背面在Java堆和Native堆中来回复制数据带来的性能损耗

3.全局共享

4.能被自动管理,但是在检测手段上可能会有一些简陋

5.可能出现OutOfMemoryError异常

JVM自动内存管理:内存区域基础概念的更多相关文章

  1. C学习笔记(11)--- 可变参数,浅谈内存管理 【C基础概念系列完结】

    1.可变参数(variable arguments): 可变参数允许您定义一个函数,能根据具体的需求接受可变数量的参数. int func(int, ... )             (函数 fun ...

  2. jvm是如何管理内存的

    1.JVM是如何管理内存的 Java中,内存管理是JVM自动进行的,无需人为干涉. 了解Java内存模型看这里:java内存模型是什么样的 了解jvm实例结构看这里:jvm实例的结构是什么样的 创建对 ...

  3. Spark内核| 调度策略| SparkShuffle| 内存管理| 内存空间分配| 核心组件

    1. 调度策略 TaskScheduler会先把DAGScheduler给过来的TaskSet封装成TaskSetManager扔到任务队列里,然后再从任务队列里按照一定的规则把它们取出来在Sched ...

  4. 内存管理 & 内存优化技巧 浅析

    内存管理 浅析 下列行为都会增加一个app的内存占用: 1.创建一个OC对象: 2.定义一个变量: 3.调用一个函数或者方法. 如果app占用内存过大,系统可能会强制关闭app,造成闪退现象,影响用户 ...

  5. 【原创】android内存管理-内存泄漏原因

    转载请注明出处 http://www.cnblogs.com/weiwangnuanyang/p/5704596.html 先讲一下内存泄漏的概念:内存泄露是指无用对象持续占有内存,或者内存得不到及时 ...

  6. Java中的垃圾回收机制&内存管理&内存泄漏

    1. Java在创建对象时,会自动分配内存,并当该对象引用不存在的时候,释放这块内存. 为什么呢? 因为Java中使用被称为垃圾收集器的技术来监视Java程序的运行,当对象不再使用时,就自动释放对象所 ...

  7. 构造函数,C++内存管理,内存泄漏定位

    构造函数 1.构造顺序 虚基类构造函数,基类构造函数,类对象构造函数,自己的构造函数 2.必须使用初始化列表 (1) 引用成员,常量成员: (2) 基类没默认构造函数(自己重载覆盖了), (3)类对象 ...

  8. jvm是如何管理内存的 .ZT

    http://blog.csdn.net/u014421556/article/details/51744044

  9. Linux内核内存管理-内存访问与缺页中断【转】

    转自:https://yq.aliyun.com/articles/5865 摘要: 简单描述了x86 32位体系结构下Linux内核的用户进程和内核线程的线性地址空间和物理内存的联系,分析了高端内存 ...

随机推荐

  1. Unity3D学习笔记(十六):Animator新动画

    新动画系统: 给模型选择动画类型 普通动画:Generic 人形动画:Humanoid 建立动画控制器 - 在Project右击 - 选择Create-AnimatorContorller 将对应动画 ...

  2. 并发队列ConcurrentLinkedQueue、阻塞队列AraayBlockingQueue、阻塞队列LinkedBlockingQueue 区别和使用场景总结

      三者区别与联系: 联系,三者 都是线程安全的.区别,就是 并发  和 阻塞,前者为并发队列,因为采用cas算法,所以能够高并发的处理:后2者采用锁机制,所以是阻塞的.注意点就是前者由于采用cas算 ...

  3. myEclipse 下配置多个Tomcat

    1.进入perfomance 2. 进入server  右键点击configure server connector 3. 切换到 “Arguments” 面板,这里有 一个启动参数,就是修改一下路径 ...

  4. MongoDB(课时24 全文索引)

    3.6.3 全文索引 在一些信息管理平台上经常需要进行信息模糊查询,最早的时候是利用了某个字段上实现的模糊查询,但这个时候返回的信息并不会很准确,因为只能够查A字段或B字段,而在MongoDB里面实现 ...

  5. [框架模式]经典的模型视图控制器模式MVC

    参考:<设计模式> http://blog.csdn.net/u010168160/article/details/43150049 百度百科 引言: Model(模型)是应用程序中用于处 ...

  6. Bata冲刺 第一天

    一.冲刺第一天完成任务情况及贡献小时数: 姓名 今日已完成任务 时间(h) 马仲山 代码调整 2 马婧(12) 整理需求文档 2 马婧(13) 整理设计文档 2 马世芳 编写测试文档 2 张俊逸   ...

  7. 《剑指offer》第二十一题(调整数组顺序使奇数位于偶数前面)

    // 面试题21:调整数组顺序使奇数位于偶数前面 // 题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有 // 奇数位于数组的前半部分,所有偶数位于数组的后半部分. #inclu ...

  8. 《剑指offer》第五题(替换空格)

    // 替换空格 // 题目:请实现一个函数,把字符串中的每个空格替换成"%20".例如输入“We are happy.”, // 则输出“We%20are%20happy.”. # ...

  9. C++STL2--map

    C++STL2--map 一.心得 本质上就是数组,关联数组,map就是键到值得一个映射,并且重载了[]符号,所以可以像数组一样用. map<string,int> cnt;//前键后值, ...

  10. [Java学习] 强调一下编程风格

    讲完了Java的基础语法,大家就可以编写简单的程序代码了,这里有必要强调一下编程风格. 代码风格虽然不影响程序的运行,但对程序的可读性却非常重要.自己编写的程序要让别人看懂,首先在排版方面要非常注意. ...