把知道的java内存结构简单缕一缕
主要有这个几个
[b]方法区
堆(分代的)[/b]
这两个算是比较清晰的
还有一个不大清晰的 [b]JVM方法栈[/b]
方法区就是存放Class信息的 如类的继承层次,类的静态变量 有哪些字段 哪些方法等等
这块内存通过permSize maxPermSize来指定其大小
堆是保存对象的内存空间,你创建的每个对象都保存在堆中
堆的大小通过-Xms -Xmx来控制大小 通常设置
堆是分代管理的,有新生代和旧生代
新创建的对象放在新生代,经过几轮GC仍然存活的会转到旧生代
大对象也可能直接分配到旧生代,至于多大要用-XX:PretenureSizeThreshold来指定
其中新生代有分为3部分 Eden S0 S1
可通过-Xmn来指定新生代的大小
栈:每个线程都对应一个栈,线程结束后栈内存被释放
栈的大小通过-Xss指定
栈中不会保存对象 只是保存对象的引用
但是会保存一些局部的基本类型 如 int long等
主要有这个几个
[b]方法区
堆(分代的)[/b]
这两个算是比较清晰的
还有一个不大清晰的 [b]JVM方法栈[/b]
方法区就是存放Class信息的 如类的继承层次,类的静态变量 有哪些字段 哪些方法等等
这块内存通过permSize maxPermSize来指定其大小
堆是保存对象的内存空间,你创建的每个对象都保存在堆中
堆的大小通过-Xms -Xmx来控制大小 通常设置
-Xms == -Xmx
堆是分代管理的,有新生代和旧生代
新创建的对象放在新生代,经过几轮GC仍然存活的会转到旧生代
大对象也可能直接分配到旧生代,至于多大要用-XX:PretenureSizeThreshold来指定
其中新生代有分为3部分 Eden S0 S1
可通过-Xmn来指定新生代的大小
栈:每个线程都对应一个栈,线程结束后栈内存被释放
栈的大小通过-Xss指定
栈中不会保存对象 只是保存对象的引用
但是会保存一些局部的基本类型 如 int long等