JVM 内存结构分析以及GC的解释

JVM 内存分配

内存主要分为:

1.程序计数器(私有):线程执行到的字节码的行号指示器:程序进行的位置等,便于线程切换时恢复
2.虚拟机栈 (私有):用与存储局部变量和部分过程结果,是java方法的数据描述 - 方法执行时就是栈中栈帧的进出  -Xss 设置单个线程的栈大小 = -XX:ThreadStackSize
	内部包含:
		i.局部变量表: 存储入参和局部变量 - 引用
		ii.操作数栈 - 中间计算的结果
		iii.动态链接 - 方法的引用- 在运行时转换为直接链接
		iv.方法出口等
		v.一些附加信息:栈帧中还允许携带与Java虚拟机实现相关的一些附加信息。例如,对程序调试提供支持的信息。
		
3.本地方法栈(私有):运行的是本地的方法(native)
4 堆:java内存最大的一块,所有对象实例、数组都存放在java堆,GC回收的地方,线程共享
5.方法区:使用直接内存:MetaSpace (之前在堆的一个逻辑分区)(以前叫做方法区 现在叫做元空间) i.类信息,常量,静态变量,即时编译后的代码等数据
6.直接内存

堆的结构

1.堆 主要分为 新生代 (又分为 Eden空间、From Survivor空间、To Survivor空间 通常用内存的比例 8:1:1 )1/3   老年代  2/3
2  新生对象创建在 Eden 内 垃圾回收后 剩余 进入 From Survivor ,To Survivor ,对象被标记了15次后进入 老年代 或者 对象占据空间太大 也会存在在老年代

GC

针对HotSpot VM的实现,它里面的GC其实准确分类只有两大种:
1.Partial GC:并不收集整个GC堆的模式
新生代收集(Minor GC / Yang GC) 只是新生代垃圾收集
老年代收集(Major GC / Old GC) 只是老年代垃圾收集 目前只有CMS GC 会单独收集老年代的行为
混合收集(Mixed GC):收集整个新生代以及部分老年代的垃圾收集(目前只有G1 GC 会有这种行为)
2.Full GC:收集整个java 堆和方法区的垃圾收集

垃圾回收触发机制
年轻代GC触发机制:年轻代内存不足是 会触发 Minor GC 主要指的是 Eden空间 空间触发 From Survivor ,To Survivor 着两者不会触发 会相互晋升 到老年代。 Minor GC 会引发 STW 机制,暂停用户其他进程垃圾回收结束后 进程才能运行(Minor GC 暂停时间短)
老年代GC 触发机制:老年代内存不足时 会触发 Major GC 老年代的对象被情况时 发生了 Full GC 或者 Major GC 老年代空间不足时 会先触发 至少一次的 Minor GC 空间还不足够 则触发 Major GC
Major GC 的执行速度要比 Minor GC 慢很多 年轻代占据内存较少
Full GC 触发机制:
调用 System.gc() 时 系统建议 执行 Full GC 但不是必然的
老年代空间不足
方法区空间不足
Minor GC 执行后 进入老年带的平均大小 大于 老年代可用的空间大小
Full GC 是开发或者 生产中 要尽量避免的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值