深入理解JVM(一)Java内存区域
运行时数据区
程序计数器
当前线程执行的字节码的行号指示器
每条线程都有独立的程序计数器,各线程之间计数器互不影响,独立存储。
如果执行的是java方法,计数器记录正在执行的虚拟机字节码指令的位置;
如果执行的是native方法,计数器值为空(undefined)
虚拟机栈
每个方法在执行的同时会创建一个栈帧,用于存储局部变量表,操作数栈,动态链接,方法出入口等信息。
一个方法从调用到执行完成就对应栈帧从入栈到出栈。
两种异常:
- 线程请求栈深度大于虚拟机允许的最大深度,StackOverFlowError
- 如果虚拟机允许栈动态拓展,且在拓展时无法申请到足够内存,抛出OutOfMemoryError
堆
唯一目的,存放对象实例,也称为GC堆
是GC管理的主要区域
方法区
存储已被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等数据
方法区是JVM的一种规范,落地可能是不同的实现
PermGen space
是 JDK7及之前, HotSpot 虚拟机 对方法区
的一个落地实现。在JDK8被移除。Metaspace
(元空间)是 JDK8及之后, HotSpot 虚拟机 对方法区
的新的实现。元空间与永久代之间最大的区别在于:元空间并不在虚拟机中,而是使用本地内存。
当方法区无法满足内存分配要求,抛出OutOfMemoryError
对象初始化过程
对象的内存布局
对象在内存中存储的布局可以分为三块区域:对象头(Header),实例数据(Instance Data),对齐填充(Padding)
对象头
长度一般为32位或者64位,分为两部分信息:一部分用于存储对象自身的运行时数据,如哈希码,GC分代年龄,锁状态标志,线程持有的锁,偏向线程的ID,偏向时间戳等,称之为Mark Word。另一部分是类型指针,是对象指向他的类元数据的指针,用于确定是哪个类的实例(非必须);如果是数组还需要有一块记录数组长度的数据
实例数据
在程序代码中定义的各种类型的字段内容,无论是继承的还是自己的。
对齐填充
非必须,内存管理系统要求对象起始地址必须是8字节的整数倍,通常用于填充实例数据。
对象的访问方式
java程序通过栈上的reference数据来操作对象。常用的有两种,使用句柄和直接指针
使用句柄
java堆中划出一块用于存储句柄(句柄池),reference存储的就是句柄地址
好处是当对象被移动时只需要修改句柄中实例数据地址
使用指针
reference存储对象地址,对象存在在堆中同时需要存储到对象类型的指针和对象实例数据
好处是减少了一次指针定位的开销,Sun HotPot是以这种方式访问的
深入理解JVM(一)Java内存区域的更多相关文章
- 理解JVM之Java内存区域
Java虚拟机运行时数据区分为以下几个部分: 方法区.虚拟机栈.本地方法栈.堆.程序计数器.如下图所示: 一.程序计数器 程序计数器可看作当前线程所执行的字节码行号指示器,字节码解释器工作时就是通过改 ...
- 深入理解JVM - 1 - Java内存区域划分
作者:梦工厂链接:https://www.jianshu.com/p/7ebbe102c1ae来源:简书简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处. Java与C++之间有一堵 ...
- 深入理解JVM(一)--Java 内存区域
一. 运行时数据区域 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域. Java虚拟机所管理的内存将会包括以下几个运行时数据区域: ...
- 深入理解JVM(二)Java内存区域
2.1 C.C++内存管理是由开发人员管理,而Java则交给了JVM进行自动管理 2.2 JVM运行时数据区:方法区.堆(运行时线程共享),虚拟机栈.本地方法栈.程序计数器(运行时线程隔离,私有) 1 ...
- JVM之Java内存区域
JVM之Java内存区域 世界上并没有完美的程序,但我们并不因此而沮丧,因为写程序本来就是一个不断追求完美的过程. 一.JAVA内存区域 谈及JAVA虚拟机运行时数据区域就不得不祭出这张经典的图了: ...
- 学习jvm(一)--java内存区域
前言 通过学习深入理解java虚拟机的教程,以及自己在网上的查询的资料,做一个对jvm学习过程中的小总结. 本文章内容首先讲解java的内存分布区域,之后讲内存的分配原则以及内存的监控工具.再下来会着 ...
- 深入理解JVM(6)——Java内存模型和线程
Java虚拟机规范中定义了Java内存模型(Java Memory Model,JMM)用来屏蔽掉各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的内存访问效果(“即Ja ...
- 史上最详细JVM,Java内存区域讲解
本人免费整理了Java高级资料,一共30G,需要自己领取:传送门:https://mp.weixin.qq.com/s/JzddfH-7yNudmkjT0IRL8Q 运行时数据区域 JVM载执行Jav ...
- JVM:Java内存区域与内存溢出异常
Java 虚拟机在执行 Java 程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以及创建和销毁时间,有些区域随着虚拟机进程的启动而存在,有些区域依赖用户线程的启动和 ...
- 深入理解虚拟机之Java内存区域
1 概述 对于Java程序员来说,在虚拟机自动内存管理机制下,不再需要像C/C++程序开发程序员这样为内一个new 操作去写对应的delete/free操作,不容易出现内存泄漏和内存溢出问题.正是因为 ...
随机推荐
- java8 探讨与分析匿名内部类、lambda表达式、方法引用的底层实现
问题解决思路:查看编译生成的字节码文件 目录 测试匿名内部类的实现 小结 测试lambda表达式 小结 测试方法引用 小结 三种实现方式的总结 对于lambda表达式,为什么java8要这样做? 理论 ...
- hystrix信号量和线程池的区别
- git 远程分支和tag标签的操作
git远程分支操作:1.创建远程分支git push --set-upstream origin develop:develop2在服务器创建远程分支devlop2,让本地的develop分支和dev ...
- Struts2 执行流程 以及 Action与Servlet比较 (个人理解)
上图提供了struts2的执行流程.如下: 1:从客户端发出请求(HTTPServletRequest). 2:请求经过各种过滤器(filter),注:一般情况下,如SiteMesh等其他过滤器要放在 ...
- MongoDB入门二
MongoDB配置 本地启动 c:\MongoDB\bin>mongod.exe --dbpath "C:\\MongoDB\data\db" --logpath " ...
- Java中List集合去除重复数据的方法1
1. 循环list中的所有元素然后删除重复 public static List removeDuplicate(List list) { for ( int i = ...
- css3 小三角的用法
<div class="arrow-up"> <!--向上的三角--> </div> <div class="arrow-dow ...
- 一.5.序列化应用之服务器制造厂与型号app功能
1.环境准备: (python36env) [vagrant@CentOS7 apps]$ django-admin startapp manufacturer (1)激活:'manufacturer ...
- 初探RabbitMQ消息队列
SpringBoot 是为了简化 Spring 应用的创建.运行.调试.部署等一系列问题而诞生的产物,自动装配的特性让我们可以更好的关注业务本身而不是外部的XML配置,我们只需遵循规范,引入相关的依赖 ...
- Mac上使用Docker Desktop启动Kubernetes,踩坑后终于搞掂
1 前言 Kubernetes又简称k8s,是Google开源的容器集群管理系统,最近也是火热.闲来无事(为了发文),捣鼓了一下,在Mac上搭建Kubernetes,遇到一些坑,也记录一下. 另外,D ...