1. jvm基础
1. 类的加载过程
加载,验证,准备,解析,初始化,使用,销毁
2. 内存划分
- 线程私有
- 程序计数器 没有OOM
- JAVA虚拟机栈
- 本地方法栈
- 线程共享
- java堆
- 方法区,包括:运行时常量池
- 直接内存
3. 如何设置内存大小
-Xms:Java堆内存的大小
-Xmx:Java堆内存的最大大小
-Xmn:Java堆内存中的新生代大小,扣除新生代剩下的就是老年代的内存大小了
-XX:PermSize:永久代大小
-XX:MaxPermSize:永久代最大大小
-Xss:每个线程的栈内存大小
XX:SurvivorRatio=8 Eden和Survivor区的比例
-XX:MaxTenuringThreshold=5 对象多少岁进入老年代
-XX:PretenureSizeThreshold=1M 多大的对象直接进入老年代
-XX:+UseParNewGC 新生代使用ParNew垃圾回收器
-XX:+UseConcMarkSweepGC 老年代使用CMS垃圾回收器
-XX:CMSInitiatingOccupancyFaction 老年代占用多大比例会fullGc
-XX:CMSFullGCsBeforeCompaction=0 老年代多少fullGc后会进行碎片整理
具体计算:
如果机器内存为4G,jvm的内存大概是2G,
除了栈内存和方法去,堆内存大概能分1G,
老年代分几百兆,新生代就就只有几百兆了
每秒访问量 * 每次访问创建的对象大小 * (10~20)--- 100 * 1k * 10 = 1M
几百秒就会触发一次GC
4. 什么时候会触发老年代Gc
- 老年代可用内存小于新生代全部对象大小,没有开启空间担保参数,会直接触发fullGc,所以一般空间担保参数会打开
- 老年代可用内存小于每次新生代进入老年代的平均大小,会提前触发fullGc
- minorGc后存活对象大于survivor,会进入老年代,如果老年代空间不足,会触发fullGc
- -XX:CMSInitiatingOccupancyFaction参数设置老年代对象占用比例超过多少,会触发CMS
5. 对象是如何进入老年代的