Java内存分区

参考:
Java虚拟机—栈帧、操作数栈和局部变量表
Cyc博客
一、运行时数据区域:
在这里插入图片描述
一、程序计数器:记录正在执行的虚拟机字节码指令的地址(如果正在执行的是本地方法则为空)
二、Java虚拟机栈:每个java方法在执行的同时会创建一个栈帧用于存储局部变量、操作数、动态链接、方法返回地址
在这里插入图片描述
通过-Xss这个虚拟机参数来指定每个线程的Java虚拟机栈内存大小,在JDK1.4中默认是256K,在JDK1.5中默认是1M

java -Xss128K

该区域可能抛出以下异常:
StackOverflowError:当线程请求的栈深度超过最大值,会抛出StackOverflowError异常。单线程下其实只会抛这种。
OutOfMemoryError:当不断建立线程时,内存不够用,就会抛此异常。


三、本地方法栈:本地方法栈为本地服务,其他和java虚拟机栈类似。
四、堆:所有对象都在这里分配内存,是垃圾收集的主要区域。可以将堆分成两块:

  • 新生代
  • 老年代
    可以通过-Xms和-Xmx这两个虚拟机参数来制定一个程序的堆内存大小,第一个参数是设置初始值,第二个参数是设置最大值。

五、方法区:用于存放已被加载的类信息,常量、静态变量、即时编译后的代码等数据。
HotSpot 虚拟机把它当成永久代来进行垃圾回收。但很难确定永久代的大小,因为它受到很多因素影响,并且每次 Full GC 之后永久代的大小都会改变,所以经常会抛出 OutOfMemoryError 异常。为了更容易管理方法区,从 JDK 1.8 开始,移除永久代,并把方法区移至元空间,它位于本地内存中,而不是虚拟机内存中。

方法区是一个 JVM 规范,永久代与元空间都是其一种实现方式。在 JDK 1.8 之后,原来永久代的数据被分到了堆和元空间中。元空间存储类的元信息,静态变量和常量池等放入堆中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值