重读《深入理解Java虚拟机》

一、Java虚拟机内存区域如何划分

1、Java虚拟机内存区域的划分


区域名称


作用(用途)


类型


特点


虚拟机规定异常情况


其他说明

1 程序计数器 指示当前正在执行的字节码指令地址 线程私有 1、内存空间较小
2、随用户进程的启动和结束而建立和销毁。
每个线程都有独立的程序计数器。执行Native方法时为空指针。
2 虚拟机栈(栈内存) Java方法执行的内存模型(方法栈帧入栈、出栈)。每个方法执行的时候都会创建一个栈帧用于存储局部变量表、操作数,动态链接、方法出口等。
为虚拟机执行Java方法服务,用于执行Java方法
线程私有 1、内存空间较小
2、随用户进程的启动和结束而建立和销毁
1、StackOverflowError:线程请求栈深大于虚拟机所允许的栈深。
2、OutMemoryError:如虚拟机栈可以动态扩展,如果在扩展时无法申请到足够的内存时抛出异常
局部变量表:用于存放编译期可知的类型,包括基本类型,引用类型,returnAddress类型。局部变量表所需内存空间在编译期已完成分配,运行期不改变局部变量表大小。
3 本地方法栈 为虚拟机使用到的Native方法服务即用于执行Native方法 线程私有 1、内存空间较小
2、随用户进程的启动和结束而建立和销毁
1、StackOverflowError:
2、OutMemoryError:
 
4 堆(GC堆,堆内存) 用于存放对象实例,几乎所有的对象实例都在这里分配 线程共享 1、内存空间较大;
2、随虚拟机进程启动而创建
3、垃圾收集器主要管理的区域
4、不需要连续的内存空间,只要逻辑上连续即可
1、OutMemoryError:堆中没有内存可用于完成实例分配,并且堆也无法再扩展的时候抛出 1、根据垃圾收集器实现算法(分代收集算法)分为:Eden空间、From Survivor空间、ToSurvivor空间。(新生代,老年代)
2、从内存分配角度:堆可划分为多个线程私有的分配缓存区,目的是为了更好的回收内存和更快的分配内存
5 方法区(非堆) 用于存储虚拟机已经加载的类信息、常量、静态变量、即时编译器编译后的代码等(存放Class的相关信息如类名,访问修饰符,常量池,字段描述,方法描述等) 线程共享 1、堆内存的一个逻辑部分
2、内存回收主要针对常量池的回收和类型的卸载
1、OutMemoryError:方法去无法满足内存分配需求时抛出,即没有足够的内存用于分配 运行常量池:用于存放编译期生成的各种字面量和符号引用,在类加载后进入运行时常量池时存放。运行时常量池具备动态性即常量可以在编译期内产生也可以在运行期添加新的常量···

直接内存不是Java内存区域。


2、堆内存空间内:对象实例的创建、内存布局和内存定位

(1)堆内存空间内对象如何创建分配

1)根据new指令的类型常量在常量池内定位到该类型的符号引用、并判断该类是否已加载、解析和初始化

2)如果判断类型信息未加载则进行加载

3)在堆内分配指定大小的堆内存空间

如何分配堆内存空间:a、指针碰撞:即堆内存空间物理上是连续分配的,分配相对规整的,在用过的内存往未用过的内存方向进行分配

b、空闲列表:即堆内存空间不是规整分配的,使用一个空闲列表记录当前未分配的内存空间,分配时在该空闲列表内查询符合指定大小的内存空间进行分配

如何保证内存分配的正确性:线程私有分配缓冲区(TLAB),每个线程独立分配一块小内存区域(本地线程分配缓冲),每个线程只在自己的TLAB内分配实例对象。设置TLAB:-XX:+/-UseTLAB

4)自动初始化:初始化内存空间的默认值

5)设置对象头信息

6)执行init初始化方法按照对象声明位置进行初始化

(2)堆内存空间内对象如何布局

1)对象头

2)实例数据

3)对齐

(3)堆内存空间内对象如何定位

1)句柄

2)直接指针


3、OOM异常调试和参数设置


溢出区域


参数设置


异常抛出条件


其他说明

-Xms
-Xmx
堆内存无法自动扩展,没有足够内存分配实例对象 设置参数-XX:+HeapDumpOnOutMemoryError在出现异常时Dump出现当前内存堆转储快照用于事后分析
虚拟机栈和本地方法 -Xss:设置虚拟机栈大小
-Xoss:设置本地方法大小
1、StackOverflowError:线程请求栈深大于虚拟机所允许的栈深。
2、OutMemoryError:如虚拟机栈可以动态扩展,如果在扩展时无法申请到足够的内存时抛出异常
每个线程分配的虚拟机栈容量越大,则可建立的线程数就越少
方法区和运行时常量 -XX:PermSize方法区最小容量
-XX:MaxPermSize:最大方法区容量
1、OutMemoryError:方法去无法满足内存分配需求时抛出,即没有足够的内存用于分配  
直接内存 -XX:MaxDirectMemorySize:指定直接内存最大容量,如果不指定默认与堆同等大小容量 1、OutMemoryError:方法去无法满足内存分配需求时抛出,即没有足够的内存用于分配 不属于Java内存区域
直接内存=物理内存-各个区域内存总和

二、如何实现垃圾收集和内存分配

三、虚拟机性能如何监控、如何处理故障、如何分析

四、Java程序如何存储(类文件结构)

五、Java程序如何载入(类的加载机制)

六、Java程序如何执行(虚拟机字节码执行引擎)

七、Java程序代码如何优化

八、Java的内存模型

九、Java线程

时间: 2024-08-09 00:54:42

重读《深入理解Java虚拟机》的相关文章

《深入理解Java虚拟机》:类加载的过程

<深入理解Java虚拟机>:类加载的过程 类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载.验证.准备.解析.初始化.使用和卸载七个阶段.其中类加载的过程包括了加载.验证.准备.解析.初始化五个阶段. 下面详细讲述类加载过程中每个阶段所做的工作. 加载 加载时类加载过程的第一个阶段,在加载阶段,虚拟机需要完成以下三件事情: 1.通过一个类的全限定名来获取其定义的二进制字节流. 2.将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构. 3.在Java堆中生成一

【深入理解Java虚拟机】类加载机制

本文内容来源于<深入理解Java虚拟机>一书,非常推荐大家去看一下这本书. 本系列其他文章: [深入理解Java虚拟机]Java内存区域模型.对象创建过程.常见OOM [深入理解Java虚拟机]垃圾回收机制 1.类加载机制概述 虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制. 在java中,类型的加载.连接和初始化过程都是在程序运行期间完成的,这种策略虽然会带来一些性能开销,但是却为jav

深入理解Java虚拟机到底是什么

摘自:http://blog.csdn.net/zhangjg_blog/article/details/20380971 什么是Java虚拟机 我们都知道Java程序必须在虚拟机上运行.那么虚拟机到底是什么呢?先看网上搜索到的比较靠谱的解释: 虚拟机是一种抽象化的计算机,通过在实际的计算机上仿真模拟各种计算机功能来实现的.Java虚拟机有自己完善的硬体架构,如处理器.堆栈.寄存器等,还具有相应的指令系统.JVM屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在Java虚拟机上运行的

深入理解java虚拟机笔记(一)-java内存区域与内存溢出

1. 前言 这是深入理解java虚拟机一书的笔记,来自第二章.因为这本书讲的比较深奥,这是第二次看,需要记录一下笔记. 2. 运行时数据区域 java虚拟机所管理的内存分为以下几个区域. ps:图片来自网络 2.1 程序计数器 程序计数器是一块较小的内存空间,他可以看做是当前线程所执行字节码的行号指示器.字节码解释器工作时就是通过改变这个计数器的值来选去下一条要执行的字节码指令,分之.循环.跳转.异常处理.线程恢复等基础功能都需要依赖这个计数器来完成. 这块内存是线程私有的内存. 如果线程在执行

《深入理解java虚拟机》:类的初始化

深入理解java虚拟机>:类的初始化 类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载.验证.准备.解析.初始化.使用和卸载七个阶段.其中验证.准备.解析3个部分统称为连接.类加载的过程包括了加载.验证.准备.解析.初始化五个阶段. 加载.验证.准备.初始化和卸载这5个阶段的顺序时确定的,类的加载过程必须按照这种顺序按部就班的开始,而解析阶段则不一定,它在某些情况下可以在初始化阶段之后开始,这是为了支持Java语言的运行时绑定(也成为动态绑定或晚期绑定).另外注意这里的

深入理解java虚拟机系列(一):java内存区域与内存溢出异常

文章主要是阅读<深入理解java虚拟机:JVM高级特性与最佳实践>第二章:Java内存区域与内存溢出异常 的一些笔记以及概括. 好了开始.如果有什么错误或者遗漏,欢迎指出. 一.概述 先上一张图 这张图主要列出了Java虚拟机管理的内存的几个区域. 常有人把Java内存区分为堆内存(Heap)和栈内存(Stack),这种分法比较粗糙,Java内存区域的划分实际上远比这复杂,从上图就可以看出了.堆栈分法中所指的"栈"实际上只是虚拟机栈,或者说是虚拟机栈中的局部变量表部分.接下

《深入理解Java虚拟机》读书笔记——第1章 走近Java

(注:原文请见<深入理解Java虚拟机>周志明 著,知识点部分参考百度百科) 总述 第1章分为两个部分:Java概述及自己动手编译JDK的教程. 1 Java概述 介绍了Java的整体特性.Java的技术体系组成.Java及JVM的发展史. 1.1 Java的总体特性 1)Java不仅仅是一门编程语言,更是由一系列计算机软件和规范组成的技术体系. 2)Java具有众多优点: a.Java虚拟机在千差万别的物理机上建立了统一的运行平台,实现了跨平台性.(主要) b.提供了相对安全的内存管理和访问

(1) 深入理解Java虚拟机到底是什么?

好文转载:http://blog.csdn.net/zhangjg_blog/article/details/20380971 什么是Java虚拟机 作为一个Java程序员,我们每天都在写Java代码,我们写的代码都是在一个叫做Java虚拟机的东西上执行的.但是如果要问什么是虚拟机,恐怕很多人就会模棱两可了.在本文中,我会写下我对虚拟机的理解.因为能力所限,可能有些地方描述的不够欠当.如果你有不同的理解,欢迎交流. 我们都知道Java程序必须在虚拟机上运行.那么虚拟机到底是什么呢?先看网上搜索到

《深入理解Java虚拟机 JVM高级特性...》核心笔记

深入理解Java虚拟机 JVM高级特性与最佳实践(第二版) 核心笔记 JAVA 环境: JAVA虚拟机高级特性: 一:java内存区域与内存异常 一):运行数据区     1:程序计数器(Program Counter Register),也称"PC寄存器" A:用来指示需要执行哪条指令的.(在汇编语言中,CPU在得到指令之后,程序计数器便自动加1或者根据                    转移指针得到下一条指令的地址,如此循环,直至执行完所有的指令.) B:由于在JVM中,多线程

深入理解java虚拟机(二)HotSpot Java对象创建,内存布局以及访问方式

内存中对象的创建.对象的结构以及访问方式. 一.对象的创建 在语言层面上,对象的创建只不过是一个new关键字而已,那么在虚拟机中又是一个怎样的过程呢? (一)判断类是否加载.虚拟机遇到一条new指令的时候,首先会检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号代表的类是否被加载.解析并初始化.如果没有完成这个过程,则必须执行相应类的加载. (二)在堆上为对象分配空间.对象需要的空间大小在类加载完成后便能确定.之后便是在堆上为该对象分配固定大小的空间.分配的方式也有两种: