区域划分:

  java虚拟机在执行程序的过程中,将内存分为功能不同的几个区域,如下图:

  此图列出了内存划分的各个区域,其中

  线程私有的:程序计数器、虚拟机栈、本地方法栈

  线程共享的:堆、方法区

下面,逐个介绍各个区域的功能及作用

  程序计数器:

    1.程序计数器主要用来指向正在执行的字节码行号,每个线程都有一个单独的程序计数器,互不共享,通过改变这个计数器指向的字节码行号来执行程序

    2.循环、跳转、异常处理等机制都是依赖这个计数器来完成的

    3.若程序执行的是java程序,他指向的是正在执行的字节码,若执行的是native方法,则他的值为空

  java虚拟机栈:

    1.虚拟机栈是线程私有的,每个方法在执行时都会创建一个栈帧,用于存储本地变量表、方法出口、动态链接、操作数栈等信息,

    2.每个方法的执行的过程都是一个虚拟机栈从入栈到出栈的过程

      许多人常说java内存分为堆内存和栈内存,其中栈内存所指的就是这个虚拟机栈

    上面提到本地变量表,这里主要存放着编译器可知的基本数据类型(int\byte\char\long等)、对象引用、returnaddress类型

    扩展:

       对象引用(reference):不是对象本身,可能是指向对象所在的起始地址的引用指针,可能是代表对象的句柄或相关的其他位置

       returnaddress:不是java api中的类型,无法让我们所调用,他指向的是一条字节码指令的地址

  本地方法栈

    类似于虚拟机栈,是为native方法服务的内存

  Java堆

    堆内存是线程共享内存,他的主要目的是用来存储对象,也是垃圾收集器管理的主要区域

    Java堆分为新生代和老年代,具体有关于垃圾回收机制会在后续文章中介绍

  方法区(也成为非堆)

    也是内存共享内存,用来存储加载的类信息、常量、静态变量、即时编译器编译后的代码等

    运行时常量池:是方法区的一部分,用于存储编译器生成的各种字面量和符号引用

  直接内存:

    不是虚拟机运行时数据区一部分,不属于JVM所管理的内存

    在NIO中可以使用native函数直接分配直接内存,并且通过java中的DirectByteBuffer对象作为这块内存的引用来操作

    优点: 节省了内存复制的步骤,效率更快

    缺点:不易控制,容易造成内存泄露

  

JVM高级特性-一、java内存结构区域介绍的更多相关文章

  1. 《深入理解Java虚拟机:JVM高级特性与最佳实践》【PDF】下载

    <深入理解Java虚拟机:JVM高级特性与最佳实践>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230062566 内容简介 作为一位 ...

  2. jvm高级特性(4)(内存分配回收策略)

    JVM高级特性与实践(四):内存分配 与 回收策略 一. 内存分配 和 回收策略 1,对象内存分配的概念: 往大方向讲,它就是在堆上分配(但也可能经过JIT编译后被拆散为标量类型并间接地栈上分配), ...

  3. 读书笔记-《深入理解Java虚拟机:JVM高级特性与最佳实践》

    目录 概述 第一章: 走进Java 第二章: Java内存区域与内存溢出异常 第三章: 垃圾收集器与内存分配策略 第四章: 虚拟机性能监控与故障处理 第五章: 调优案例分析与实战 第六章: 类文件结构 ...

  4. jvm高级特性(5)(1)(原子性,可见性,有序性,volatile,概述)

    JVM高级特性与实践(十二):高效并发时的内外存交互.三大特征(原子.可见.有序性) 与 volatile型变量特殊规则 简介: 阿姆达尔定律(Amdahl):该定律通过系统中并行化与串行化的比重来描 ...

  5. jvm高级特性(6)(线程的种类,调度,状态,安全程度,实现安全的方法,同步种类,锁优化,锁种类)

    JVM高级特性与实践(十三):线程实现 与 Java线程调度 JVM高级特性与实践(十四):线程安全 与 锁优化 一. 线程的实现 线程其实是比进程更轻量级的调度执行单位. 线程的引入,可以把一个检查 ...

  6. jvm高级特性(2)(判断存活对象算法,finaliza(),方法区回收)

    JVM高级特性与实践(二):对象存活判定算法(引用) 与 回收 垃圾回收器GC(Garbage Collection) 于1960年诞生在MIT的Lisp是第一门真正使用内存动态分配和垃圾收集技术的语 ...

  7. 深入理解JVM虚拟机11:Java内存异常原理与实践

    本文转自互联网,侵删 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutori ...

  8. Java 内存结构备忘录

    本文详细描述了 Java 堆内存模型,垃圾回收算法以及处理内存泄露的最佳方案,并辅之以图表,希望能对理解 Java 内存结构有所帮助.原文作者 Sumith Puri,本文系 OneAPM 工程师编译 ...

  9. Java内存结构、类的初始化、及对象构造过程

    概述 网上关于该题目的文章已经很多,我觉得把它们几个关联起来讲可能更好理解一下.与其它语言一样,它在执行我们写的程序前要先分配内存空间,以便于存放代码.数据:程序的执行过程其实依然是代码的执行及数据的 ...

随机推荐

  1. android奋战的一周

    移动开发项目终于开始了,我也开始紧张起来了,就靠着培训时候学的一知半解的知识,作为一个主力不得不逼着自己不停的做实验,不停的学习. 有辛苦就有回报,我也对android开发中整体的框架有了些许的了解. ...

  2. uoj#179 线性规划

    这是一道模板题. 本题中你需要求解一个标准型线性规划: 有nn个实数变量x1,x2,⋯,xnx1,x2,⋯,xn和mm条约束,其中第ii条约束形如∑nj=1aijxj≤bi∑j=1naijxj≤bi. ...

  3. PHP怎么打开或者关闭文件?

    什么是文件处理? 文件处理包括读取,关闭,重写等.掌握文件的处理需要读者理清思路,掌握好文件处理的关键步骤和常用函数,那么就可以运用自如了!感兴趣的请移步php文件处理专题. 比如,访问一个文件需要 ...

  4. 构建你人生里的第一个 Laravel 项目

    安装 Laravel 安装器 composer global require "laravel/installer" 创建项目 laravel new links 检查是否安装成功 ...

  5. 博弈论(Game Theory) - 01 - 前传之占优战略均衡

    博弈论(Game Theory) - 01 - 前传之占优战略均衡 开始 我们现在准备攀爬博弈论的几座高峰. 我们先看看在纳什均衡产生之前,博弈论的发展情况. 我们的第一座高峰是占优战略均衡. 囚徒困 ...

  6. 如何使用angular-ui的弹出框

    在开发项目时,我们经常性的会遇到弹出框的需求,例如登陆,注册,添加信息等等....面对这一需求,我们当然也可以使用自己的双手进行编写,如果你时间充足可以试试. 今天我们讲解一下如何在angular框架 ...

  7. 【更新WordPress 4.6漏洞利用PoC】PHPMailer曝远程代码执行高危漏洞(CVE-2016-10033)

    [2017.5.4更新] 昨天曝出了两个比较热门的漏洞,一个是CVE-2016-10033,另一个则为CVE-2017-8295.从描述来看,前者是WordPress Core 4.6一个未经授权的R ...

  8. Redis入门学习

    一.摘要 二.五种数据类型的基本命令操作 三.Redis连接池 四.普通同步方式 五.事务方式(Transactions) 六.管道(Pipelining) 七.管道中调用事务 八.分布式直连同步调用 ...

  9. 命令模式(Command Pattern)

    命令模式属于对象的行为模式.命令模式又称为行动(Action)模式或交易(Transaction)模式.命令模式把一个请求或者操作封装到一个对象中.命令模式允许系统使用不同的请求把客户端参数化,对请求 ...

  10. InputStream类详解

    InputStream这个抽象类是所有基于字节的输入流的超类,抽象了Java的字节输入模型.在这个类中定义了一些基本的方法.看一下类的定义: public abstract class InputSt ...