深入理解JVM(二)Java内存区域
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内存区域的更多相关文章
- 理解JVM之Java内存区域
Java虚拟机运行时数据区分为以下几个部分: 方法区.虚拟机栈.本地方法栈.堆.程序计数器.如下图所示: 一.程序计数器 程序计数器可看作当前线程所执行的字节码行号指示器,字节码解释器工作时就是通过改 ...
- 深入理解JVM - 1 - Java内存区域划分
作者:梦工厂链接:https://www.jianshu.com/p/7ebbe102c1ae来源:简书简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处. Java与C++之间有一堵 ...
- 深入理解JVM(一)--Java 内存区域
一. 运行时数据区域 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域. Java虚拟机所管理的内存将会包括以下几个运行时数据区域: ...
- JVM之Java内存区域
JVM之Java内存区域 世界上并没有完美的程序,但我们并不因此而沮丧,因为写程序本来就是一个不断追求完美的过程. 一.JAVA内存区域 谈及JAVA虚拟机运行时数据区域就不得不祭出这张经典的图了: ...
- 学习jvm(一)--java内存区域
前言 通过学习深入理解java虚拟机的教程,以及自己在网上的查询的资料,做一个对jvm学习过程中的小总结. 本文章内容首先讲解java的内存分布区域,之后讲内存的分配原则以及内存的监控工具.再下来会着 ...
- 深入理解JVM(6)——Java内存模型和线程
Java虚拟机规范中定义了Java内存模型(Java Memory Model,JMM)用来屏蔽掉各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的内存访问效果(“即Ja ...
- JVM(1) Java内存区域
对于Java程序员来说,在虚拟机自动内存管理机制的帮助下,不再需要为每一个new操作去写配对的delete/free代码,不容易出现内存泄漏和内存溢出问题.不过,也正是因为Java程序员把内存控制的权 ...
- 史上最详细JVM,Java内存区域讲解
本人免费整理了Java高级资料,一共30G,需要自己领取:传送门:https://mp.weixin.qq.com/s/JzddfH-7yNudmkjT0IRL8Q 运行时数据区域 JVM载执行Jav ...
- JVM:Java内存区域与内存溢出异常
Java 虚拟机在执行 Java 程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以及创建和销毁时间,有些区域随着虚拟机进程的启动而存在,有些区域依赖用户线程的启动和 ...
随机推荐
- msvcp140.dll丢失解决方案
[首先给出99%情况下都能解决这个问题的最简单办法]: 下载并安装微软VC++2015版运行库 (英文全称:Microsoft Visual C++ 2015 Redistributable Pa ...
- 过滤器手动注入Service Bean方法
@Override public void init(FilterConfig arg0) throws ServletException { ServletContext servletContex ...
- WindowsServer2012R2开机进入CMD,关闭后黑屏问题
原因分析: 因为自己在卸载IIS的时候,不小心卸载了.net framework,系统没有了图形界面(由完整模式Full变为了核心模式core),需要重新恢复.net framework4.5. 解决 ...
- 深度森林DeepForest
级联森林(Cascade Forest) 级联森林结构的图示.级联的每个级别包括两个随机森林(蓝色字体标出)和两个完全随机树木森林(黑色). 假设有三个类要预测,因此,每个森林将输出三维类向量,然后将 ...
- 1、根"/"目录结构
1.目录结构 FSH [root@localhost /]# tree -L . ├── bin -> usr/bin #普通用户使用的命令 ├── boot #存放系统启动相关文件,例如ker ...
- JS高级-虚拟DOM
virtual dom 虚拟DOM是Vue和React的核心 用JS模拟DOM结构 DOM变化的相比,放在JS层来做 遇到问题 DOM操作是“昂贵”的,js运行效率高 尽量减少DOM操作,而不是“推到 ...
- activemq 无法消费! consumers are alive when the messages are stuck !
我的微服务中, activemq 消费 一条消息的时候, 出了错, 结果导致了 那条消息就一直处于pending 状态, queue.user.545c2ed5-fee7-482a-bb59-564b ...
- spring 之 类型转换 2
spring内置的转换器 在spring xml 文件中,配置属性的时候, 不管实际是 list 还是map ,还是Date, 或者原生的java 类型, 我们只能配置xml 给它们. 那么 spri ...
- leetcode1030
class Solution(object): def __init__(self): self.List = list() def bfs(self,R,C,S,V): T = list() whi ...
- model.form使用,配合form的钩子
一次model.form的使用记录,配合form钩子的过程 在写信息采集功能的时候,需要添加资产信息,使用modelform组件减少工作量 官网介绍:版本1.9.https://docs.django ...