Java的自动内存管理——JVM内存划分

一、学习背景

真相让你自由

Java程序员把内存控制的权利交给了Java虚拟机,一旦出现内存泄漏和溢出方面的问题,如果不了解虚拟机是怎样使用内存的,那排查错误将会是一件异常艰难的工作。JVM——Java虚拟机

二、内存使用的划分

JVM的内存管理划分如下图:


三、各内存区域介绍

一块蛋糕,分成5块,有的(区域线程们)一起吃,有的(区域线程)自己吃

1、堆

存放的数据:对象实例

扩展性:可通过参数-Xms(初始),-Xmx(最大)配置大小,配成一样时,无法动态扩展

可能出现的错误:

                        OutOfMemoryError:无内存分配给对象实例,或者无法动态扩展内存时

内部分区:新生代(Eden Space, From Survivor Space, To Survivor Space)

                 老年代

2、方法区(永久代)

存放的数据:类信息、常量、静态变量、即时编译的代码

扩展性:运行时常量池(方法区的一部分),可通过参数-XX:PermSize(初始)和-XX:MaxPermSize(最大),JDK1.8之后取消了这两个参数的设置,改为 -XX:MetaspaceSize和-XX:MaxMetaspaceSize。

可能出现的错误:

                        OutOfMemoryError:无满足内存分配,或者无法动态扩展内存时

3、虚拟机栈

存放的数据:Java方法的局部变量表、操作栈、动态链接、方法出口

扩展性:部分可以

可能出现的错误:

                        OutOfMemoryError:无法动态扩展内存时

                         StackOverflowError:栈深度请求过大

4、程序计数器

存放的数据:代码(字节码)执行的行号指示器

扩展性:不可扩展

5、本地方法栈

存放的数据:本地方法的局部变量表、操作栈、动态链接、方法出口

扩展性:部分可以

可能出现的错误:

                        OutOfMemoryError:无法动态扩展内存时

                         StackOverflowError:栈深度请求过大

6、直接内存(Direct Memory)

非上图中JVM管理的内存,但使用不当有可能报错:OutOfMemoryError,

一般在NIO程序中会使用到直接内存。


总结:Java程序运行所需内存 = JVM内存 + 直接内存。任意一块区域内存不足或无法扩展时,都会报错OutOfMemoryError。


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值