java虚拟机内存结构
JVM内存结构共分为虚拟机栈、堆、方法区、程序计数器、本地方法栈五个部分。
| 堆内存 | 存放对象实例,几乎所有的对象实例都在这里分配内存 | 线程共享 | |
| 方法区 | 储类信息、常量、静态变量等数据 | 线程共享 | 又称非堆内存,很多人愿意把方法区称为“永久代”,本质上两者并不等价,使用永久代来实现方法区而已。jdk7及以前永久代,jdk8及以后元空间。元空间不在虚拟机设置的内存中,而是使用本地内存。 |
| 栈内存 | 存储局部变量表、操作栈、动态链接、方法出口等信息 | 线程私有 | |
| 内地方法栈 | 本地方法栈则是为虚拟机使用到的Native方法服务 | 线程私有 | |
| 程序计数器 | 可以看做是当前线程所执行的字节码的行号指示器 | 线程私有 |
堆内存
堆内存是虚拟机所管理的内存中最大的一块。Java堆划分为新生代和老年代两个区域默认比例为1:2。而年轻代又被分成Eden区、From Survivor区、To Survivor区三部分,默认情况下年轻代按照8:1:1的比例来分配;
新生代:所有新生成的对象都是放在年轻代的。年轻代的目标就是尽可能快速的收集掉那些生命周期短的对象。大部分对象在Eden区中生成。当Eden区满时,还存活的对象将被复制到Survivor区(两个中的一个),当这个 Survivor区满时,此区的存活对象将被复制到另外一个Survivor区,当这个Survivor去也满了的时候,从第一个Survivor区复制过来的并且此时还存活的对象,复制次数达到一定数量或大对象新生代Eden区无法装入时将被装入年老代。复制算法垃圾回收。
老年代:在年轻代中经历了N次垃圾回收后仍然存活的对象,就会被放到年老代中。可年老代中存放的是一些生命周期较长的对象。标记压缩法垃圾回收。
java堆和非堆内存是日后jvm调优的主战场。
个人微信公众号,欢迎关注。



