一、jvm内存组成:堆、方法区、栈
- 堆组成:新生代(eden+from+to)、老年代
- 栈组成:java虚拟机栈、本地方法栈(执行本地方法)
- 方法区:存放对象信息、常量、静态变量;线程共享;jdk8后移到“Metaspace”的本地内存
二、参数设置
- 最小堆内存:-Xms
- 最大堆内存:-Xmx(一般与-Xms一样,避免gc后重新分配内存)
- 新生代:-Xmn(剩下堆内存为老年代)
- 新生代最小:-XX:NewSize
- 新生代最大:-XX:MaxNewSize
- 每个线程堆栈:-Xss
- 新生代、老年代比例: –XX:NewRatio (默认1:2)
- eden/from/to:–XX:SurvivorRatio(默认8:1:1)
- 方法区最小:-XX:PermSize(默认85M)
- 方法区最大:-XX:MaxPermSize(默认64M)
三、gc
1.gc算法
- 标签-清除:从根节点开始标记使用中的对象,未被标记的将清除。
- 复制:从根节点开始标记使用中的对象,并复制到一块新的空间,完了之后清除原来整块内存空间。
- 标记-压缩:从根节点开始标记使用中对象,之后将其整理到内存的一端,清理剩下部分。
- 分代收集:对新生代、老年代采用不同垃圾回收算法。
- gc机制
- 对新生代采用复制算法
新生代对象存活时间短,更新频繁,适合复制算法。新生代分为eden、from、to,新建对象首先存入eden,当eden满了后,将存活对象放入from,当from也满了后将eden和from存活对象放入to,如此往复;对于复制次数达配置值(默认16)时,将对象放入老年代。 - 老年代采用标记-清除 或 标记压缩
老年代满了后会触发major gc或full gc,应尽量避免或减少。
网友评论