一、JVM运行时数据区

1、程序计数器:

(1)一块较小的线程私有的内存空间。

(2)JVM的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,在任何一个确定的时刻,一个处理器(或一个内核)只会执行一条线程中的指令。

(3)为了线程切换后能恢复到原先的执行位置,每条线程都需要一个独立的程序计数器,互不影响,独立存储。

(4)如果线程执行的是一个Java方法,程序计数器记录的就是正在执行的虚拟机字节码指令的地址;如果线程执行的是Native方法,程序计数器的值则为空。

(5)程序计数器是JVM规范中唯一一个没有规定任何OutOfMemoryError(内存溢出)异常的区域。

2、虚拟机栈

(1)线程私有的,生命周期与线程相同。

(2)虚拟机栈描述的是Java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧,方法从调用到执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程。

(3)笼统的划分会把Java的内存区分为堆内存(Heap)和栈内存(Stack),这里的栈指的就是虚拟机栈,或者说是虚拟机栈的局部变量表部分。

(4)局部变量表存放了编译期可知的各种基本数据类型(boolean、byte、char、short、int、float、long、double)、对象引用和returnAddress类型(指向了一条字节码指令的地址)。

(5)局部变量表在编译期间即确定了所需的内存空间,并且大小固定不会改变。

(6)栈有可能会抛出两种异常:StackOverflowError和OutOfMemoryError。

3、本地方法栈

与虚拟机栈作用类似,区别就是虚拟机栈为执行Java方法(也就是字节码)服务,而本地方法栈则为虚拟机使用到的Native方法服务。

4、堆

(1)所有线程共享的一块内存区域,在虚拟机启动时创建。

(2)唯一目的就是存放对象实例。

(3)Java堆是垃圾收集器管理的主要区域,有时也被称为GC堆。

5、方法区

(1)线程共享的内存区域,用于存储已加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

(2)虽然Java虚拟机规范把方法区描述为堆的一个逻辑部分,但是它有一个别名叫做Non-Heap(非堆)。

(3)这部分区域的内存回收主要是针对常量池的回收和对类型(Class)的卸载。

6、运行时常量池

(1)方法区的一部分。

(2)包括各种字面量和符号引用。

二、直接内存

1、Direct Memory,不属于虚拟机运行数据区的一部分。

2、JDK1.4中新加入了NIO类,基于通道和缓冲区的I/O方式,它可以使用Native函数库直接分配堆外内存,然后通过存储在Java堆中的DirectByteBuffer对象来操作直接内存的引用。

3、直接内存的分配不受Java堆大小的限制,但是如果配置虚拟机参数时忽略直接内存,可能会导致动态扩展时出现OutOfMemoryErrory异常。

JVM学习总结(一):Java内存区域的更多相关文章

  1. JVM系列1:Java内存区域

    JVM系列主要分享自己都虚拟机的理解,我自学时的知识框架多来源于<深入理解Java虚拟机_JVM高级特性与最佳实践>这本书,感兴趣的朋友可直接去阅读这本书. 本系列暂定有3部分,它们是学习 ...

  2. JVM系列一(Java内存区域和对象创建).

    一.JVM 内存区域 堆 - Heap 线程共享,JVM中最大的一块内存,此内存的唯一目的就是存放对象实例,Java 堆是垃圾收集器管理的主要区域,因此很多时候也被称为"GC堆"( ...

  3. JVM虚拟机(三):Java内存区域

    运行时数据区   Java虚拟机再执行Java程序过程中会把它所管理的内存划分为若干个不同分工的数据区域. 程序计数器   程序计数器时一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示 ...

  4. 深入理解JVM(一)Java内存区域

    运行时数据区 程序计数器 当前线程执行的字节码的行号指示器 每条线程都有独立的程序计数器,各线程之间计数器互不影响,独立存储. 如果执行的是java方法,计数器记录正在执行的虚拟机字节码指令的位置: ...

  5. java虚拟机学习-JVM内存管理:深入Java内存区域与OOM(3)

    概述 Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来. 对于从事C.C++程序开发的开发人员来说,在内存管理领域,他们即是拥有最高权力的皇帝又 ...

  6. 学习jvm(一)--java内存区域

    前言 通过学习深入理解java虚拟机的教程,以及自己在网上的查询的资料,做一个对jvm学习过程中的小总结. 本文章内容首先讲解java的内存分布区域,之后讲内存的分配原则以及内存的监控工具.再下来会着 ...

  7. JVM学习笔记(一):Java内存区域

    由于Java程序是交由JVM执行的,所以我们在谈Java内存区域划分的时候事实上是指JVM内存区域划分.在讨论JVM内存区域划分之前,先来看一下Java程序具体执行的过程: 首先Java源代码文件(. ...

  8. JVM高级特性与实践(一):Java内存区域 与 内存溢出异常

    套用<围城>中的一句话,“墙外面的人想进去,墙里面的人想出来”,用此来形容Java与C++之间这堵内存动态分配和垃圾收集技术所围成的“围墙”就再合适不过了. 对于从事C.C++的开发人员而 ...

  9. 【搞定Jvm面试】 Java 内存区域揭秘附常见面试题解析

    本文已经收录自笔者开源的 JavaGuide: https://github.com/Snailclimb ([Java学习+面试指南] 一份涵盖大部分Java程序员所需要掌握的核心知识)如果觉得不错 ...

  10. JVM Java 内存区域透彻分析(转)

    出处:  Java 内存区域透彻分析  Java8内存模型—永久代(PermGen)和元空间(Metaspace) 这篇文章主要介绍Java内存区域,也是作为Java虚拟机的一些最基本的知识,理解了这 ...

随机推荐

  1. CSS font-family字体大合集

    在写文字内容占大篇幅的页面是,总是会面临着改变字体的需求,以下为font-family常用合集以及一部分文字效果: windows常见内置中文字体 字体中文名             字体英文名    ...

  2. WCF发布到IIS 7.0,并以https访问

    一.IIS 7.0中如何生成服务器证书,并要求网站以http访问可参考: http://www.cnblogs.com/chnking/archive/2008/10/07/1305811.html ...

  3. ELK+MySQL出现大量重复记录问题处理

    一.使用Logstash使用jdbc从MySQL读取数据操作 1.1 安装jdbc插件 jdbc默认已安装,如果没安装使用logstash-plugin安装即可(logstash-plugin在log ...

  4. protobuf example make backup

    # See README.txt. .PHONY: all cpp java python clean all: cpp #java python cpp: add_person_cpp list_p ...

  5. trap(陷井)

    if True: x = 15 print(x)print(x) # 可见 if 语句,不是一个代码块,因为代码块有独立的作用域,代码块结束时,会释放变量 l1 = [1,2,3,4]print(id ...

  6. web项目执行流程

    先扫描web.xml文件 jsp请求servlet servlet  调数据/不调数据 重定向/转发       Dao(封装数据)   Biz(数据处理)     逻辑判段 返回前端界面显示

  7. Android 音视频深入 九 FFmpeg解码视频生成yuv文件(附源码下载)

    项目地址,求star https://github.com/979451341/Audio-and-video-learning-materials/tree/master/FFmpeg(MP4%E8 ...

  8. react源码探索

    react核心部分为 虚拟dom对象 虚拟dom差异化算法 单向数据流渲染 组件生命周期 事件处理 1) 虚拟dom对象: reactDOM.render(args,element); 这个方法第一个 ...

  9. unity中将多张图片进行椭圆运动

    GameObject canvas; ; ; ; ; Dictionary<int,GO> storeItem; GameObject main; public static bool r ...

  10. chrome扩展应用API

    background scripts可以访问所有的 WebExtension JavaScript APIs ,但是不能直接访问页面 content scripts 可以通过标准的DOM api 读取 ...