内存区域划分:
堆 heap —主要数据、线程共享(线程安全问题)
方法区 method Area—线程共享—类加载器的类信息、常量、静态变量(编译后class文件信息)
栈 stack—线程私有—生命周期跟随线程、局部变量表、操作栈、动态链接、方法出口
程序计数器—线程私有—记录线程执行情况
GC 的对象是 heap区域
Jvm对不同生命周期的对象进行分类,对堆内存区域进行逻辑划分。
按照存活时间分为:(分代收集算法)
年轻代 Eden Servivor + 闲置Servivor---- 年轻代的GC->Minor GC
老年代 (永久代-元数据空间)——经历多次Minor GC仍然存活的放入老年代——老年代的GC->Major GC
分配规则:
1、优先Eden
2、大对象、长期存活对象 直接进入老年代
GC触发会耗时:
要控制好内存和配置,减少触发
Gc触发条件:
1、system.gc()
2、老年代空间不足—新生代对象转入、创建大对象
GC收集器--实现gc的各类算法——CMS最优秀
分析GC日志,
GC [PSYoungGen: 251986K->1403K(917504K)]
FullGC [PSYoungGen: 1403K->0K(917504K)]
JVM调优大部分堆GC的调优
GC的原因大部分是代码问题
减少对象创建数量、减少全局变量+大对象
调整新生代、老年代大小
选择合适的gc收集器
调整—监控--对比—分析—调整