JVM内存管理

• 传统程序语言:由程序员手动内存管理

–C/C++,malloc申请内存和free释放内存

–由于程序员疏忽或程序异常,导致内存泄露

• 现代程序语言:自动内存管理

–Java/C#,采用内存自动管理

–程序员只需要申请使用,系统会检查无用的对象并回收内存

–系统统一管理内存,内存使用相对高效,但也会出现异常

JVM内存(1)

线程私有内存

程序计数器(Program Counter Register)

Java虚拟机栈(JVM Stack)

本地方法栈(Native Method Stack)

多线程共享内存

堆(Heap)

方法区(Method Area)

运行时常量池

 

JVM内存(2)

程序计数器
Program Counter Register, 一块小内存,每个线程都有
PC存储当前方法
线程正在执行的方法称为该线程的当前方法
当前方法为本地(native)方法时, pc值未定义(undefined)
当前方法为非本地方法时,pc包含了当前正在执行指令的地址
当前唯一一块不会引发OutOfMemoryError异常
 
 
JVM 内存 (3)
JVM 栈(JVM Stack,Java 栈)
每个线程有自己独立的Java虚拟机栈, 线程私有
-Xss设置每个线程堆栈大小
Java方法的执行基于栈
每个方法从调用到完成对应一个栈帧在栈中入栈、出栈的过程
栈帧存储局部变量表、操作数栈等
局部变量表存放方法中存在“栈”里面的东西
引发的异常
栈的深度超过虚拟机规定深度,StackOverflowError异常
无法扩展内存,OutOfMemoryError异常
 
 
JVM 内存 (4)
本地方法栈(Native Method Stacks)
存储native方法的执行信息, 线程私有
VM规范没有对本地方法栈做明显 规定
引发的异常
栈的深度超过虚拟机规定深度,StackOverflowError异常
无法扩展内存,OutOfMemoryError异常
 
JVM 内存 (5)
堆(Heap)
虚拟机启动时创建, 所有线程共享,占地最大
对象实例和数组都是在堆上分配内存
垃圾回收的主要区域
设置大小
-Xms 初始堆值,-Xmx最大堆值
引发的异常
无法满足内存分配要求,OutOfMemoryError异常
 
 
JVM 内存 (6)
方法区(Method Area)
存储JVM已经加载类的结构, 所有线程共享
运行时常量池、类信息、常量、静态变量等
JVM启动时创建,逻辑上属于堆(Heap)的一部分
很少做垃圾回收
引发的异常
无法满足内存分配要求, OutOfMemoryError异常
 
 
JVM 内存 (7)
运行时常量池(Run-Time Constant Pool)
Class文件中常量池的运行时表示
属于方法区的一部分
动态性
Java语言并不要求常量一定只有在编译期产生
比如String.intern方法
引发的异常
无法满足内存分配要求,OutOfMemoryError异常
 
总结 • 理 清JVM内存分类 对照class文件,理解JVM各部分内存的作用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值