标签:类型 局部变量 ade lang ram gen 次数 永久 建议
堆与栈分开设计是为什么呢?
栈的大小可以通过-XSs设置,如果不足的话,会引起java.lang.StackOverflowError的异常
线程私有,生命周期与线程相同。每个方法执行的时候都会创建一个栈帧(stack frame)用于存放 局部变量表、操作栈、动态链接、方法出口。
存放对象实例,所有的对象的内存都在这里分配。垃圾回收主要就是作用于这里的。
因此一般都建议把这两个参数设置成一样大,可以避免JVM在不断调整大小。
这里记录了线程执行的字节码的行号,在分支、循环、跳转、异常、线程恢复等都依赖这个计数器。
类型信息、字段信息、方法信息、其他信息
总结
名称 | 特征 | 作用 | 配置 | 异常 |
---|---|---|---|---|
栈区 | 线程私有,使用一段连续的内存空间 | 存放局部变量表、操作栈、动态链接、方法出口 | -XSs | StackOverflowError OutOfMemoryError |
堆 | 线程共享,生命周期与虚拟机相同 | 保存对象实例 | -Xms -Xmx -Xmn | OutOfMemoryError |
程序计数器 | 线程私有、占用内存小 | 字节码行号 | 无 | 无 |
方法区 | 线程共享 | 存储类加载信息、常量、静态变量等 | -XX:PermSize -XX:MaxPermSize | OutOfMemoryError |
上面可以看到堆分成三个区域:
这里可以详细的说一下新生代复制回收的算法流程:
在新生代中,分为三个区:Eden, from survivor, to survior。
标签:类型 局部变量 ade lang ram gen 次数 永久 建议
原文地址:https://www.cnblogs.com/panxuejun/p/8779634.html