深入理解JAVA虚拟机阅读笔记1——JAVA内存区域
一、Java内存区域
1.程序计数器
线程私有。
当前线程所执行的字节码的行号指示器。由于JAVA是多线程的,因此每个线程都独立的程序计数器。
异常:没有规定任何OutOfMemeryError情况的区域。
2. Java虚拟机栈

线程私有。
描述Java方法的内存模型——栈帧(局部变量表、操作数栈、动态链接、方法出口)。每个方法从调用到执行完成,对应一个栈帧入栈到出栈的过程。
异常:StackOverflowError和OutOfMemoryError异常
3.本地方法栈
线程私有。
本地方法栈为虚拟机用到的Native方法服务。
异常:StackOverflowError和OutOfMemoryError异常
4.Java堆
线程共享。
所有的对象实例以及数组都要在堆行分配,因此是垃圾回收器管理的主要区域,也称为"GC堆"。
从垃圾回收角度,又将堆分为“新生代”和“老年代”或者“Eden”、“From Survivor”、“To Survivor”。
从多线程角度,可将堆划分出多个线程私有的分配缓冲区(TLAB)。
异常:OutOfMemoryError异常
5.方法区
线程共享。
主要为类服务,存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
运行时常量池是方法区的一个组成部分,用以存放编译期生成的各种字面量和符号引用。
异常:OutOfMemoryError异常
二、对象的创建过程
虚拟机遇到一个new指令,首先检查指令的参数能否在常量池中定位到一个类的符号引用;
检查这个引用代表的类是否已被加载、解析、初始化过;
如果没有,则进入到类的初始化过程;
如果有,则类加载检查通过后,为新生对象在堆中分配内存。分配内存的方法可以是“指针碰撞”,也可以是“空闲列表”等。考虑多线程情况,先在TLAB中分配内存,TLAB用完时,才用到同步锁定;
将分配的内存空间都初始化为0;
在对象的对象头中进行必要的设置(哪个类?、如果找到类的元数据、哈希码、GC分代年龄等);
虚拟机完成初始化,开始用户自定义初始化;
三、对象的访问定位
访问定位的方式有两种:
1.使用句柄

2. 直接指针

深入理解JAVA虚拟机阅读笔记1——JAVA内存区域的更多相关文章
- 深入理解JAVA虚拟机阅读笔记5——Java内存模型与线程
Java内存模型是定义线程共享的变量的访问规则(实例字段.静态字段和构成数组对象的元素),但不包括线程私有的局部变量和方法参数. 1.主内存与工作内存 Java内存模型规定,所有的变量都必须存储在主内 ...
- 深入理解java虚拟机阅读笔记(1)运行时数据区域
java虚拟机所管理的内存区域主要分为方法区.堆:虚拟机栈.本地方法栈.程序计数器,如图: 1.程序计数器是当前线程所执行的字节码行号指示器,用以记录当前指令执行的位置.程序计数器是线程私有的,每个线 ...
- 深入理解Java 虚拟机阅读笔记(一)
1.程序计数器- 占用空间:较小 作用:字节码行号指示器 作用详情:指示指令执行,如(字节码的执行,分支,循环,跳转,异常处理,线程恢复) 特点:线程私有(每个计数器独立计算,上下文相互独立). 2. ...
- 深入理解Java虚拟机--阅读笔记二
垃圾收集器与内存分配策略 一.判断对象是否已死 1.垃圾收集器在对堆进行回收前,要先判断对象是否已死.而判断的算法有引用计数算法和可达性分析算法: 2.引用计数算法是给对象添加引用计数器,有地方引用就 ...
- 深入理解Java虚拟机--阅读笔记一
Java内存区域 一.java运行时数据区域 1. 程序计数器:程序计数器占据的内存空间较小,是当前运行线程执行的字节码的计数:分支.循环.跳转.异常处理.线程恢复等都要依赖技术器来对执行的字节码进行 ...
- 深入理解JAVA虚拟机阅读笔记4——虚拟机类加载机制
虚拟机把描述类的Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制. 在Java语言中,类型的加载.连接和初始化过程都是 ...
- JAVA虚拟机(一):内存区域
根据<java虚拟机规范第二版>规定,现阶段的java内存区域总体如下图 其中,方法区和堆是所有线程共享区域. 虚拟机栈,本地方法栈,程序计数器是各线程独占. 概述一下各个区域 先说说线程 ...
- 深入理解JAVA虚拟机阅读笔记6——线程安全与锁优化
线程安全:如果一个对象可以安全的被多个线程同时使用,那它就是线程安全的. 一.Java中的线程安全 1.不可变 不可变的对象一定是线程安全的.String.枚举类型.java.lang.Number的 ...
- 深入理解JAVA虚拟机阅读笔记3——垃圾回收器
一.垃圾收集器总览 新生代:Serial. ParNew. Parallel Scavenge 老年代:CMS.Serial Old. Parallel Old 最新的:G1 并行和并发的区别: 并行 ...
随机推荐
- 图解SSH原理
1. 初见SSH SSH是一种协议标准,其目的是实现安全远程登录以及其它安全网络服务. SSH仅仅是一协议标准,其具体的实现有很多,既有开源实现的OpenSSH,也有商业实现方案.使用范围最广泛的当然 ...
- .net mvc中session的锁机制
今天遇到个奇怪的问题, 一个秒杀商品系统, 大量秒杀请求进来, 到了action居然是单线程执行! 这样产生的效果就是“这个系统好慢啊!!”. 可是我没有加lock,为什么会变成单线程执行呢? 找资料 ...
- python 排序模块 ———— heapq(学习笔记)
from heapq import * def heasort(initi):# 排序 h=[] for value in initi: heappush(h,value)#将每一个item进入hea ...
- PSR编码规范
PSR-1 代码风格规范(1)常量命名:类中的常量所有字母都必须大写,单词间用下划线分隔(2)类命名:类的命名必须遵循 StudlyCaps 大写开头的驼峰命名规范(3)方法命名:方法名称必须符合 c ...
- ThreeJS实现波纹粒子效果
今天我们来用ThreeJS的库实现一个波纹粒子效果,我们用到的ThreeJS的库有CanvasRenderer.js,OrbitControls.js,Projector.js,stats.min.j ...
- jmeter阶梯加压线程组
添加阶梯加压线程组路径为鼠标捕获测试计划后,点击鼠标右键->添加->Threads(Users)->jp@gc – Stepping Thread Group(deprecated) ...
- .Net MVC缓存
https://www.cnblogs.com/JoeSnail/p/7993903.html
- Kubernetes探索学习001--Centos7.6使用kubeadm快速部署Kubernetes集群
Centos7.6使用kubeadm快速部署kubernetes集群 为什么要使用kubeadm来部署kubernetes?因为kubeadm是kubernetes原生的部署工具,简单快捷方便,便于新 ...
- PHP Filter 函数 日常可用
PHP Filter 函数 PHP Filesystem PHP FTP PHP Filter 简介 PHP 过滤器用于对来自非安全来源的数据(比如用户输入)进行验证和过滤. 安装 filter 函数 ...
- “秒杀”问题的数据库和SQL设计【转载】
“秒杀”问题的数据库和SQL设计 APRIL 21ST, 2015 问题的来源 完全不考虑一致性的方案 表结构 方案 存在的问题 保证单用户不会重复购买 解决超卖问题 方案 优化 提高性能了 鱼与熊掌 ...
