2.1 C、C++内存管理是由开发人员管理,而Java则交给了JVM进行自动管理

2.2 JVM运行时数据区:方法区、堆(运行时线程共享),虚拟机栈、本地方法栈、程序计数器(运行时线程隔离,私有)

  1.程序计数器(Program Counter Register):每一个线程都独有一个程序计数器,并且分配了一块线程私有的小块内存,程序运行时,这个计数器会记录字节码文件运行的行数,当线程切换时,则通过这个行数继续执行下面的操作

  2.虚拟机栈(Java Virtual Machine Stacks):

  (1)虚拟机栈是描述Java方法运行的内存模型(栈帧做着分配和调度的事情),一般描述的“栈”就是这个虚拟机栈,还指的是局部变量表,包括各种基本数据类型(boolear,byte,char,short,int,long,float,double),还有引用对象的地址;

  (2)StackOverFlowError和OutOfMemerryError都和虚拟机栈有关,前者是当线程请求的栈深度大于虚拟机所允许的深度时的异常,后者是动态扩展虚拟机栈深度之后还是超大了会出现的异常;

  3.本地方法栈(Native Method Stacks):和虚拟机栈高度相似,只不过虚拟机栈用于执行Java方法字节码分配的内存,而本地方法栈是用于本地方法,它和虚拟机栈会抛出同样的异常;关于本地方法:https://www.cnblogs.com/chen-jack/p/7904510.html

  4.堆(Java Heap):存放对象实例,线程共享,垃圾回收(新生代、老年代),内存分配可以通过-Xmx和-Xms来分配(既可扩展也可固定),超出分配的大小会出现OutOfMemeryError异常;

  5.方法区(Method Area):线程共享,存储(常量(final)、静态变量、虚拟机加载的类信息等),永久代(并不准确,只是用永久代去实现方法区,达到回收的效果,Java1.8之后没有永久代了);

  6.运行时常量池(Runtime Constant Pool)

  7.直接内存区:这个区域不属于JVM运行时数据区的一部分,但是NIO会用到这一部分内存,所以这一部分的大小可能会到时OutOfMemeryError异常;

2.3 关于对象如何创建,如何布局,如何访问:

  1.对象的创建

  2.对象在内存中存储的分3个区域:对象头(Header)、实例数据(Instance Data)、对齐补充(Padding)

    (1)对象头包含两个部分:一个是对象本身的运行时数据(哈希码、GC分代年龄、锁等),二就是类型指针(指明该对象的类);

    (2)实例数据就是我们要用到的数据,各个字段的数据,还包括从父类继承的数据;

    (3)对齐补充不是必须的,对象在内存中的大小需要时8字节的倍数,而对象头本身就是8字节的倍数,但是如果实例不是8字节的倍数时,就需要这个对齐补充了;

  3.对象的访问定位:

    (1)句柄访问:栈中的引用指向堆中的句柄池,再由句柄池指向对象;好处是对象被移动时,只需要改变句柄池里的实例数据的指针即可

  

    (2)直接访问:直接指向对象;优点是访问的速度更快

  

深入理解JVM(二)Java内存区域的更多相关文章

  1. 理解JVM之Java内存区域

    Java虚拟机运行时数据区分为以下几个部分: 方法区.虚拟机栈.本地方法栈.堆.程序计数器.如下图所示: 一.程序计数器 程序计数器可看作当前线程所执行的字节码行号指示器,字节码解释器工作时就是通过改 ...

  2. 深入理解JVM - 1 - Java内存区域划分

    作者:梦工厂链接:https://www.jianshu.com/p/7ebbe102c1ae来源:简书简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处. Java与C++之间有一堵 ...

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

    一.  运行时数据区域 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域. Java虚拟机所管理的内存将会包括以下几个运行时数据区域:               ...

  4. JVM之Java内存区域

    JVM之Java内存区域 世界上并没有完美的程序,但我们并不因此而沮丧,因为写程序本来就是一个不断追求完美的过程. 一.JAVA内存区域 谈及JAVA虚拟机运行时数据区域就不得不祭出这张经典的图了: ...

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

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

  6. 深入理解JVM(6)——Java内存模型和线程

    Java虚拟机规范中定义了Java内存模型(Java Memory Model,JMM)用来屏蔽掉各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的内存访问效果(“即Ja ...

  7. JVM(1) Java内存区域

    对于Java程序员来说,在虚拟机自动内存管理机制的帮助下,不再需要为每一个new操作去写配对的delete/free代码,不容易出现内存泄漏和内存溢出问题.不过,也正是因为Java程序员把内存控制的权 ...

  8. 史上最详细JVM,Java内存区域讲解

    本人免费整理了Java高级资料,一共30G,需要自己领取:传送门:https://mp.weixin.qq.com/s/JzddfH-7yNudmkjT0IRL8Q 运行时数据区域 JVM载执行Jav ...

  9. JVM:Java内存区域与内存溢出异常

    Java 虚拟机在执行 Java 程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以及创建和销毁时间,有些区域随着虚拟机进程的启动而存在,有些区域依赖用户线程的启动和 ...

随机推荐

  1. Ubuntu 14.10 下安装Ambari 问题汇总

    在编译安装Ambari时候遇到了很多问题,现在记录一下 1 got error npm ERR! phantomjs@1.9.12 install while building ambari-web ...

  2. aspose.cells 插入图片

    ,,"d:\\1.jpg"); Aspose.Cells.Drawing.Picture pic = worksheet.Pictures[iIndex]; pic.Placeme ...

  3. 涨知识:equals 和 == 你真的了解吗?

    基本概念 ==是运算符,比较的是两个变量是否相等: equals()是Object方法,用于比较两个对象是否相等 看一下源码: public boolean equals(Object anObjec ...

  4. Activiti的25张表

    Activiti流程引擎的运行,背后需要数据库的25张表支持,这25张表, 主要是在流程运行过程中,记录存储一些参与流程的用户主体,以及流程定义的存储,流程执行时候的一些信息,以及流程的历史信息等. ...

  5. vue中.sync 修饰符

    一直以来,都不太明白.sync的用法,归根结底原因在于,没有仔细阅读“.sync修饰符”. 正好,最近在拿一个项目练手,然后使用了elment-ui,然后在用到dialog的时候,属性visible是 ...

  6. linux命令行抓取网页快照

    linux命令行抓取网页快照-(xvfb+CutyCapt)   目的: 在一台没有安装X-server的Debian服务器上实现命令行抓取网页快照 软件: xvfb(在命令行下实现对X-server ...

  7. TensorFlow模型加载与保存

    我们经常遇到训练时间很长,使用起来就是Weight和Bias.那么如何将训练和测试分开操作呢? TF给出了模型的加载与保存操作,看了网上都是很简单的使用了一下,这里给出一个神经网络的小程序去测试. 本 ...

  8. npm下载安装文件太慢..修改这个就好了..治好多年的便秘..真香预警

    修改 npm 的安装目录下的 npmrc文件 增加一条 registry=http://registry.cnpmjs.org 将原来的https改成下面的http $ npm config set ...

  9. hadoop distcp hdfs://ns1/aaa hdfs://ns8/bbb UnknownHostException: xxx 两个高可用(ha)集群间distcp 如何识别两个集群逻辑名称

    在要执行distcp 的客户端配置添加 dfs.internal.nameservices 指local service 就是client 所在的hadoop 的逻辑名称 <!-- servic ...

  10. leetcode79

    class Solution { public boolean exist(char[][] board, String word) { for(int i=0; i<board.length; ...