深入理解Java虚拟机学习笔记(不断更新中)

本笔记为阅读周志明老师的《深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)》所整理的重点知识和一些自己整理的学习笔记,方便加深记忆与理解。

自动内存管理

1. Java内存区域与内存溢出异常

c++层序开发人员需要对每一个对象负责,即他们需要担负每个对象生命从开始到终结的维护责任。

Java程序员,在虚拟机自动内存管理机制下,不需要对每个对象进行delete/free,不容易出现内存泄漏或者内存溢出的问题。

在这里插入图片描述

线程共享区域:

方法区、堆、执行引擎、本地库接口

线程隔离的数据区:

虚拟机栈、本地方法栈、程序计数器

程序计数器:

是一个比较小的内存空间,程序计数器看作是当前线程所执行的字节码的行号指示器。在Java虚拟机的概念模型里,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,它是程序控制流的指示器,分支、循环、跳异常处线程恢复等基础功能都需要依赖于程序计数器来完成。

虚拟机栈:

与程序计数器一样,Java虚拟机栈也是线程私有的,它的生命周期和线程相同,描述的是 Java 方法执行的内存模型,每次方法调用的数据都是通过栈传递的。

经常有人把Java内存区域笼统地划分为堆内存(Heap)和栈内存(Stack),这种划分方式直接继承自传统的C、C++程序的内存布局结构,在Java语言里就显得有些粗糙了,实际的内存区域划分要比这更复杂。不过这种划分方式的流行也间接说明了程序员最关注的、与对象内存分配关系最密切的区域是“堆”和“栈”两块。“栈”通常就是指这里讲的虚拟机栈,或 者更多的情况下只是指虚拟机栈中局部变量表部分。

本地方法栈

本地方法栈(Native Method Stacks)与虚拟机栈所发挥的作用是非常相似的,区别只是虚拟机栈为虚拟机执行Java方法(字节码服务),本地方法栈则是位虚拟机提供使用到本地(native)方法的服务。

Java堆

Java堆是虚拟机管理的内存中最大的一块。Java堆是所有线程共享的一块内存区域,它在虚拟机启动时创建。堆内存唯一的目的就是存放对象实例,几乎所有Java中的对象实例都在这里分配内存。

方法区

方法区(Method Area)与Java堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等数据。虽然《Java虚拟机规范》中把方法区描述为堆的一个逻辑部分,但是它却有一个别名叫作“非堆”(Non-Heap),目的是与Java堆区分开来。

运行时常量池

运行时常量池(Runtime Constant Pool)是方法区的一部分。Class文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池表(Constant Pool Table),用于存放编译期生成的各种字面量与符号引用,这部分内容将在类加载后存放到方法区的运行时常量池中。

直接内存

直接内存(Direct Memory)并不是虚拟机运行时数据区的一部分,也不是《Java虚拟机规范》中定义的内存区域。但是这部分内存也被频繁地使用,而且也可能导致OutOfMemoryError异常出现。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值