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

  1. 老年代可用内存小于新生代全部对象大小,没有开启空间担保参数,会直接触发fullGc,所以一般空间担保参数会打开
  2. 老年代可用内存小于每次新生代进入老年代的平均大小,会提前触发fullGc
  3. minorGc后存活对象大于survivor,会进入老年代,如果老年代空间不足,会触发fullGc
  4. -XX:CMSInitiatingOccupancyFaction参数设置老年代对象占用比例超过多少,会触发CMS

5. 对象是如何进入老年代的

 

1. jvm基础_第1张图片

你可能感兴趣的:(java,jvm)