1.程序计数器
  • 作用-较小的内存空间,用于存储当前线程所执行的字节码的行号
  • 特性-每条线程有需要一个独立的程序计数器,各线程间互不影响,独立存储,称为"线程私有"的内存
     2.Java虚拟机栈-程序员口中的"栈"
  • 作用-描述Java方法执行的内存模型,每个方法执行时会创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息
  • 存储内容-局部变量表(8种基本数据类型、对象引用(指向对象地址的指针)、returnAddress类型(指向一条字节码指令的地址)),其所需的内存空间在编译期间完成分配
  • 特性-线程私有,其生命周期与线程相同
  • 异常-①线程请求栈深度大于虚拟机允许的深度-StackOverflow ②虚拟机栈动态扩展时无法申请到足够内存-OutOfMemory
     3.本地方法栈
  • 作用-与虚拟机栈类似,存储Native方法的相关信息
  • 其他-与虚拟机栈相同,线程私有
     4.Java堆-程序员口中的"堆"
  • 作用-存储对象实例,为所有对象实例及数组分配内存(注:随着技术发展,栈上分配、标量替换等优化技术使得对象实例不一定必须要在堆上分配)
  • 特性-所有线程共享的内存区域,在虚拟机启动时创建,其内存空间物理上可以不连续、逻辑必须联系
  • 异常-堆中没有足够内存完成实例分配,且堆也无法再扩展时-OutOfMemory
  • 注:GC采用分代收集算法,回收的主要目标为Java堆与方法区
     5.方法区
  • 作用-存储已被虚拟机加载的类信息、常量、静态变量、即时编译器(把源代码编译成和本地机器平台相关的机器语言,叫即时编译,即时编译器因为产生的是本地机器的机器码,能直接执行)编译后的代码等数据
  • 特性-所有线程共享的内存区域
     6.运行时常量池
  • 作用-存储编译期生成的各种字面量(int a=1  其中a为变量,1为字面量,字面量即能直接看出的值)和符号引用、翻译出来的直接引用
  • 特性-其属于方法区的一部分,所有线程共享
  • 特殊点-常量并不是一定只有编译期才能产生,运行期间也可能将新的常量放入池中,如String类的intern()方法
     7.直接内存
  • 作用-NIO类(New Input/Output),引入了基于通道(Channel)与缓冲区(Buffer)的I/O方式,使其可以使用Native函数库直接分配堆外内存,通过一个存储在Java堆中的DirectbyteBuffer对象作为这块内存的引用进行操作,避免了Java堆和Native堆中来回复制程序
  • 特性-不属于Java虚拟机内定义的内存区域
  • 示例代码-通过Channel进行复制,可以有效提高复制效率

     fileInputStream = new FileInputStream(sourceFile);
     fileOutputStream = new FileOutputStream(destFile);
     in = fileInputStream.getChannel();
     out = fileOutputStream.getChannel();
     in.transferTo(0, in.size(), out);

《深入理解Java虚拟机》学习笔记1-内存数据区域的更多相关文章

  1. 深入理解java虚拟机学习笔记(一)JVM内存模型

    上周末搬家后,家里的宽带一直没弄好,跟电信客服反映了N遍了终于约了个师傅明天早上来迁移宽带,可以结束一个多星期没网的痛苦日子了.这段时间也是各种忙,都一个星期没更新博客了,再不写之前那种状态和激情都要 ...

  2. 深入理解Java虚拟机学习笔记(一)-----Java内存区域

    一 概述 对于 Java 程序员来说,在虚拟机自动内存管理机制下,不再需要像C/C++程序开发程序员这样为内一个 new 操作去写对应的 delete/free 操作,不容易出现内存泄漏和内存溢出问题 ...

  3. 深入理解java虚拟机学习笔记(二)垃圾回收策略

    上篇文章介绍了JVM内存模型的相关知识,其实还有些内容可以更深入的介绍下,比如运行时常量池的动态插入,直接内存等,后期抽空再完善下上篇博客,今天来介绍下JVM中的一些垃圾回收策略.        一. ...

  4. 深入理解java虚拟机读书笔记1--java内存区域

    Java在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途.创建和销毁的时间,有一些是随虚拟机的启动而创建,随虚拟机的退出而销毁,有些则是与线程一一对应,随 ...

  5. 深入理解Java虚拟机 - 学习笔记 1

    Java内存区域 程序计数器 (Program Counter Register) 是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器.在虚拟机的概念模型里,字节码解释器工作时就是通过 ...

  6. 转载: Java虚拟机:运行时内存数据区域、对象内存分配与访问

    转载:  https://blog.csdn.net/a745233700/article/details/80291694  (虽然大部分内容都其实是深入理解jvm虚拟机这本书里的,不过整理的很牛逼 ...

  7. 深入理解Java虚拟机一:运行时数据区域

    根据<Java虚拟机规范(第2版)>的规定,Java虚拟机管理的内存包括下图几个运行时数据区域: 1.程序计数器        程序计数器(Program Counter Register ...

  8. 深入理解Java虚拟机学习笔记(二)-----垃圾收集器与内存分配策略

    写在前面 本节常见面试题: 如何判断对象是否死亡(两种方法). 简单的介绍一下强引用.软引用.弱引用.虚引用(虚引用与软引用和弱引用的区别.使用软引用能带来的好处). 如何判断一个常量是废弃常量 如何 ...

  9. 深入理解Java虚拟机读书笔记8----Java内存模型与线程

    八 Java内存模型与线程   1 Java内存模型     ---主要目标:定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量这样的底层细节.     ---此处的变量和J ...

  10. 深入理解Java虚拟机读书笔记1----Java内存区域与HotSpot虚拟机对象

    一 Java内存区域与HotSpot虚拟机对象 1 Java技术体系.JDK.JRE?     Java技术体系包括:         · Java程序设计语言:         · 各种硬件平台上的 ...

随机推荐

  1. nginx服务傻瓜搭建

    nginx服务傻瓜搭建 安装步骤: 一.先准备好相关源码包和程序包,如下图 所有包都在云服务器的/src目录下. 二.安装 1.安装nginx服务器,支持vod stream.fileupload c ...

  2. C语言的fopen函数(文件操作/读写)

    头文件:#include <stdio.h> fopen()是一个常用的函数,用来以指定的方式打开文件,其原型为:    FILE * fopen(const char * path, c ...

  3. C#中ToString()格式详解

    以下内容均摘自博客园,仅供资料查询. ToString格式化 在很多对象显示为字符串的时候都会使用到ToString中的格式化,由于以前没怎么注意到这个问题,想总结一下各个基础结构对象的格式化,以便后 ...

  4. EEG preprocessing - A Trick Before Doing ICA

    EEGLab maillist My ICs don't have high power in low frequency is b/c I do a small trick here. before ...

  5. [LeetCode] Minimum Moves to Equal Array Elements 最少移动次数使数组元素相等

    Given a non-empty integer array of size n, find the minimum number of moves required to make all arr ...

  6. [LeetCode] Find Right Interval 找右区间

    Given a set of intervals, for each of the interval i, check if there exists an interval j whose star ...

  7. 20145215&20145307《信息安全系统设计基础》实验五 网络通信

    小组成员:20145215卢肖明.20145307陈俊达 实验报告链接:信息安全系统设计基础--实验五实验报告

  8. VS调试经常打断点打上之后没反应的问题

    在调试的时候经常会发现打了断点但是始终不进到程序中来,这是因为访问的这个页面在服务器中有缓存,也就是在iis中产生了缓存.访问的时候直接进到读取的缓存文件, 根本没有读取项目文件,所以打了断点肯定进不 ...

  9. 未在本地计算机上注册“Microsoft.Jet.OleDb.4.0”提供程序。解决办法

    在64位服务器系统上,默认不支持Microsoft.Jet.OLEDB.4.0的驱动程序,系统默认会提示未在本地计算机上注册"Microsoft.Jet.OLEDB.4.0"的错误 ...

  10. python基础补漏-06-其他常用模块

    JSON/Pickle: 首先我们要明白 什么事序列化--> 就是进行不同程序之间的数据交换 那JSON 和Pickle是什么鬼... 就是不同的方式而已 import json name = ...