JVM垃圾回收相关问题整理

哪些引用对象可以作为GC ROOT?JVM垃圾回收的根对象的范围有以下几种:虚拟机栈中的引用对象 方法区中的类静态属性引用对象 方法区中常量引用的对象(final的常量值) 本地方法栈JNI(Java本地接口/Java Native Interface)的引用对象JVM垃圾回收过程关于堆内存的结构划分?在JVM中堆空间划分如下图所示上图中,刻画了Java程序运行时的堆空...
摘要由CSDN通过智能技术生成

哪些引用对象可以作为GC ROOT?

JVM垃圾回收的根对象的范围有以下几种:

  • 虚拟机栈中的引用对象
  • 方法区中的类静态属性引用对象
  • 方法区中常量引用的对象(final的常量值)
  • 本地方法栈JNI(Java本地接口/Java Native Interface)的引用对象

JVM垃圾回收过程关于堆内存的结构划分?

在JVM中堆空间划分如下图所示

上图中,刻画了Java程序运行时的堆空间,可以简述成如下2条

1.JVM中堆空间可以分成三个大区,新生代、老年代、永久代

2.新生代可以划分为三个区,Eden区,两个幸存区

在JVM运行时,可以通过配置以下参数改变整个JVM堆的配置比例

1.JVM运行时堆的大小

-Xms堆的最小值

-Xmx堆空间的最大值

2.新生代堆空间大小调整

-XX:NewSize新生代的最小值

-XX:MaxNewSize新生代的最大值

-XX:NewRatio设置新生代与老年代在堆空间的大小

-XX:SurvivorRatio新生代中Eden所占区域的大小

3.永久代大小调整

-XX:MaxPermSize

4.其他

 -XX:MaxTenuringThreshold,设置将新生代对象转到老年代时需要经过多少次垃圾回收,但是仍然没有被回收

在上面的配置中,老年代所占空间的大小是由-XX:SurvivorRatio这个参数进行配置的,看完了上面的JVM堆空间分配图,可能会奇怪,为啥新生代空间要划分为三个区Eden及两个Survivor区?有何用意?为什么要这么分?要理解这个问题,就得理解一下JVM的垃圾收集机制(复制算法也叫copy算法),步骤如下:

复制(Copying)算法

将内存平均分成A、B两块,算法过程:

1. 新生对象被分配到A块中未使用的内存当中。当A块的内存用完了, 把A块的存活对象对象复制到B块。
2. 清理A块所有对象。
3. 新生对象被分配的B块中未使用的内存当中。当B块的内存用完了, 把B块的存活对象对象复制到A块。
4. 清理B块所有对象。
5. goto 1。

优点:简单高效。缺点:内存代价高,有效内存为占用内存的一半。

图解说明如下所示:(图中后观是一个循环过程)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值