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. oracle批量删除某个用户下的所有表

    打开sql developer,输入如下语句,把USERNAME替换为需要删除的的用户名 然后把查询出来的结果复制出来执行一遍就行了. SELECT 'DROP table '||table_name ...

  2. Delphi 10-10.2.2启动提示JS错误的解决办法

    HKEY_CURRENT_USER\SOFTWARE\Embarcadero\BDS\18.0\Known IDE Packages\ $(BDS)\Bin\CommunityToolbar240.b ...

  3. 2017 browser market share

    Refer to Net Market Share published data for year 2017, browser share percentage as below table show ...

  4. [UE4]List View

    List View适合显示数以千条的列表 要点 一.创建Entry类,实现IUserObjectListEntry. 创建一个名为“EntryWidget”的UserWidget,添加如下图所示的控件 ...

  5. 关于CPU CACHE工作机制的学习

    转自:http://blog.csdn.net/notbaron/article/details/48143409 1.  存储层次结构 由于两个不谋而合的因素如下: l  硬件:由于不同存储技术的访 ...

  6. Java 泛型的作用及其基本概念

    一.泛型的基本概念 java与c#一样,都存在泛型的概念,及类型的参数化.java中的泛型是在jdk5.0后出现的,但是java中的泛型与C#中的泛型是有本质区别的,首先从集合类型上来说,java 中 ...

  7. linux如何复制文件夹和移动文件夹

    linux下文件的复制.移动与删除命令为:cp,mv,rm一.文件复制命令cp 命令格式:cp [-adfilprsu] 源文件(source) 目标文件(destination)cp [option ...

  8. android 开发 View _3_ View的属性动画ValueAnimator

    ValueAnimator ValueAnimator继承自抽象类Animator.要让属性动画渐变式地更改对象中某个属性的值,可分两步操作:第一步,动画需要计算出某一时刻属性值应该是多少:第二步,需 ...

  9. [UnityShader基础]05.模板测试

    参考链接: https://blog.csdn.net/u011047171/article/details/46928463 https://blog.csdn.net/JohnBlu/articl ...

  10. python学习笔记_week25

    note Day25 - 博客 - KindEditor - beautifulsoup4对标签进行过滤 - 单例模式 - 事务操作 - from django.db import transacti ...