1.内存结构图
2.堆内存
-Xms128m //初始值 等效于 -XX:InitialHeapSize=128m
-Xmx512m //最大值 等效于 -XX:MaxHeapSize=512m
–XX:NewRatio =3 //新域与旧域比例为1:3
1)年轻代
-Xmn100m //设置年轻代
-XX:NewSize=50 //设置新域初始值
-XX:MaxNewsize=100 //设置新域最大值。
注:Xmn 与 NewSize 都是设置新生代的内存大小。经过测试,写在最后的一个参数起作用。
2)老年代
3)存活区
-XX:SurvivorRatio=n //年轻代中Eden区与两个Survivor区的比值。
3.虚拟机栈内存
-Xss2m 设置线程栈的大小
4.本地方法栈内存
5.方法区内存
-XX:PermSize=32m 初始值
-XX:MaxPermSize=64m 最大值
6.codeCache简介
Java代码在执行时一旦被编译器编译为机器码,下一次执行的时候就会直接执行编译后的代码,也就是说,编译后的代码被缓存了起来。缓存编译后的机器码的内存区域就是codeCache。这是一块独立于java堆之外的内存区域。
网址:https://blog.youkuaiyun.com/yandaonan/article/details/50844806
7.jdk1.8变动
-
废弃永久代(PermGen)改用元空间(Metaspace)
-
为什么废弃永久代(PermGen)
1)移除永久代是为融合HotSpot JVM与 JRockit VM而做出的努力,因为JRockit没有永久代,不需要配置永久代。
2)由于永久代内存经常不够用或发生内存泄露,爆出异常java.lang.OutOfMemoryError: PermGen
-
元空间(Metaspace)跟永久代(PermGen)区别
元空间是方法区的在HotSpot jvm 中的实现,方法区主要用于存储类的信息、常量池、方法数据、方法代码等。方法区逻辑上属于堆的一部分,但是为了与堆进行区分,通常又叫“非堆”。
元空间的本质和永久代类似,都是对JVM规范中方法区的实现。不过元空间与永久代之间最大的区别在于:元空间并不在虚拟机中,而是使用本地内存。理论上取决于32位/64位系统可虚拟的内存大小。可见也不是无限制的,需要配置参数。