一、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异常

二、对象的创建过程

  1. 虚拟机遇到一个new指令,首先检查指令的参数能否在常量池中定位到一个类的符号引用;

  2. 检查这个引用代表的类是否已被加载、解析、初始化过;

  3. 如果没有,则进入到类的初始化过程;

  4. 如果有,则类加载检查通过后,为新生对象在堆中分配内存。分配内存的方法可以是“指针碰撞”,也可以是“空闲列表”等。考虑多线程情况,先在TLAB中分配内存,TLAB用完时,才用到同步锁定;

  5. 将分配的内存空间都初始化为0;

  6. 在对象的对象头中进行必要的设置(哪个类?、如果找到类的元数据、哈希码、GC分代年龄等);

  7. 虚拟机完成初始化,开始用户自定义初始化;

三、对象的访问定位

  访问定位的方式有两种:

  1.使用句柄

  2. 直接指针

深入理解JAVA虚拟机阅读笔记1——JAVA内存区域的更多相关文章

  1. 深入理解JAVA虚拟机阅读笔记5——Java内存模型与线程

    Java内存模型是定义线程共享的变量的访问规则(实例字段.静态字段和构成数组对象的元素),但不包括线程私有的局部变量和方法参数. 1.主内存与工作内存 Java内存模型规定,所有的变量都必须存储在主内 ...

  2. 深入理解java虚拟机阅读笔记(1)运行时数据区域

    java虚拟机所管理的内存区域主要分为方法区.堆:虚拟机栈.本地方法栈.程序计数器,如图: 1.程序计数器是当前线程所执行的字节码行号指示器,用以记录当前指令执行的位置.程序计数器是线程私有的,每个线 ...

  3. 深入理解Java 虚拟机阅读笔记(一)

    1.程序计数器- 占用空间:较小 作用:字节码行号指示器 作用详情:指示指令执行,如(字节码的执行,分支,循环,跳转,异常处理,线程恢复) 特点:线程私有(每个计数器独立计算,上下文相互独立). 2. ...

  4. 深入理解Java虚拟机--阅读笔记二

    垃圾收集器与内存分配策略 一.判断对象是否已死 1.垃圾收集器在对堆进行回收前,要先判断对象是否已死.而判断的算法有引用计数算法和可达性分析算法: 2.引用计数算法是给对象添加引用计数器,有地方引用就 ...

  5. 深入理解Java虚拟机--阅读笔记一

    Java内存区域 一.java运行时数据区域 1. 程序计数器:程序计数器占据的内存空间较小,是当前运行线程执行的字节码的计数:分支.循环.跳转.异常处理.线程恢复等都要依赖技术器来对执行的字节码进行 ...

  6. 深入理解JAVA虚拟机阅读笔记4——虚拟机类加载机制

    虚拟机把描述类的Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制. 在Java语言中,类型的加载.连接和初始化过程都是 ...

  7. JAVA虚拟机(一):内存区域

    根据<java虚拟机规范第二版>规定,现阶段的java内存区域总体如下图 其中,方法区和堆是所有线程共享区域. 虚拟机栈,本地方法栈,程序计数器是各线程独占. 概述一下各个区域 先说说线程 ...

  8. 深入理解JAVA虚拟机阅读笔记6——线程安全与锁优化

    线程安全:如果一个对象可以安全的被多个线程同时使用,那它就是线程安全的. 一.Java中的线程安全 1.不可变 不可变的对象一定是线程安全的.String.枚举类型.java.lang.Number的 ...

  9. 深入理解JAVA虚拟机阅读笔记3——垃圾回收器

    一.垃圾收集器总览 新生代:Serial. ParNew. Parallel Scavenge 老年代:CMS.Serial Old. Parallel Old 最新的:G1 并行和并发的区别: 并行 ...

随机推荐

  1. cogs1685 【NOI2014】魔法森林 Link-Cut Tree

    LCT练手好题啊. SPFA的做♂FA是把边按照a排序,然后加一条权值为b的边跑SPFA,不断更新答案.很好的做♂FA,但复杂度无♂FA保证. LCT的做♂FA类似,也是把边按照a排序,然后也是加一条 ...

  2. C#英文数字混合验证

    日常可见的验证码,当然不会这么简单,不过算是基本验证码中比较经典的,可以做一点参考,欢迎有更好方法的大哥们指正 using System; using System.Collections.Gener ...

  3. [PLC]ST语言六:DI/EI/FEND/WDT/FOR/NEXT

    一:DI/EI/FEND/WDT/FOR/NEXT 说明:简单的顺控指令不做其他说明. 控制要求:无 编程梯形图: 结构化编程ST语言:

  4. JUC——线程池

    线程池本质的概念就是一堆线程一起完成一件事情. Executor package java.util.concurrent; public interface Executor { void exec ...

  5. 前端常见算法面试题之 - 重建二叉树[JavaScript解法]

    题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列[1,2,4,7,3,5,6,8],和中序遍历序列[4,7 ...

  6. Aria2 Linux 完整安装及使用教程

    Aria2 嘛,主要是用来离线下载,功能强大,支持 http/https 直链.ftp.电驴.磁力链接等等,且可以跨平台使用,配合网页端操作,简直是一代下载神器. 安装 Debian/Ubuntu: ...

  7. NO.3_1:自学python之路------番外:第三方库安装、numpy

    引言 Python因为pip的存在,使得第三方库的发布和获取都比较方便.并且Python对跨平台的支持,使得其相较于C++,Java更加方便使用.在本文中,将会介绍在Windows中安装第三方库的方法 ...

  8. jQuery的基本使用

    一.jQuery简介 jQuery是一个快速.简洁的JavaScript框架,它封装了JavaScript常用的功能代码,提供一种简便的JavaScript设计模式,优化HTML文档操作.事件处理.动 ...

  9. React.js - 入门

    React.js - 第1天 1. React简介 React 起源于 Facebook 的内部项目,因为该公司对市场上所有 JavaScript MVC 框架,都不满意,就决定自己写一套,用来架设 ...

  10. Daily Scrumming* 2015.10.30(Day 11)

    一.总体情况总结 今日项目总结: 1.前后端同一了API设计以及API权限认证.用户状态保存的开发方案 2.API以及后端模型已经开始开发,前端UEditor开始学习,本周任务有良好的起步 3.前后端 ...