码迷,mamicode.com
首页 > 其他好文 > 详细

JVM

时间:2020-10-27 10:55:26      阅读:14      评论:0      收藏:0      [点我收藏+]

标签:get   碎片   最小   包含   三次   基本类型   cat   扫描   style   

1、面试JVM借鉴                  (学习:B站:狂神说)

JVM原型

技术图片

理解各个区域

技术图片

 

 

栈 

首先栈是由一个个栈帧组成,栈不可以阻塞(线程级别)

栈内存中是由一个个栈帧组成

技术图片

 

 

 栈里都有啥

  1. 8大基本类型

  2. 对象引用

  3. 实例的方法(递归的本质就是压栈,弹栈)

方法区

方法区是特殊的堆,所有线程共享,所有定义的方法的信息

技术图片

 

 方法区里都有啥

  1. 静态变量(static)

  2. 常量(final)

  3. 类信息(构造方法、接口定义)

  4. 运行时的常量池

一个JVM只有一个堆内存(栈是线程级的),堆内存的大小是可以调节的(一般堆内存都给定最大最小值为相同的值,防止内存抖动影响性能

技术图片

 

 堆内存里都有啥

实例化的对象

 堆内存详解

技术图片

 

元空间 逻辑上存在,实际不存在

 

垃圾回收GC

首先,对象出生再伊甸园区

  • 假设伊甸园区只能存一定数量的对象,则每当存满时就会触发一次轻GC(Minor GC)
  • 轻GC清理后,有的对象可能还存在引用,就活下来了,活下来的对象就进入幸存区;有的对象没用了,就被GC清理掉了;每次轻GC都会使得伊甸园区为空
  • 如果幸存区伊甸园都满了,则会进入老年代,如果老年代满了,就会触发一次重GC(FullGC)年轻代+老年代的对象都会清理一次,活下的对象就进入老年代
  • 如果新生代老年代都满了,则OOM

Minor GC:伊甸园区满时触发;从年轻代回收内存

Full GC:老年代满时触发;清理整个堆空间,包含年轻代和老年代

Major GC:清理老年代

 

清理的条件

引用为null,引用被赋新值,没有引用指向

  • 每个对象在创建的时候,就给这个对象绑定一个计数器。

  • 每当有一个引用指向该对象时,计数器加一;每当有一个指向它的引用被删除时,计数器减一。

  • 这样,当没有引用指向该对象时,该对象死亡,计数器为0,这时就应该对这个对象进行垃圾回收操作。

 

GC算法

引用计数

垃圾,不要用

 

复制算法

年轻代常用方法,浪费一半内存空间

 

标记-清除

产生内存碎片,扫描两次

不需要额外的空间

 

标记-整理

扫描三次(标记->清除->压缩)

 

再次优化

在内存空间足够的时候用标记清除算法,碎片足够多的时候进行压缩算法

 

没有最好的算法,只有最适合你的算法

 

 

JVM

标签:get   碎片   最小   包含   三次   基本类型   cat   扫描   style   

原文地址:https://www.cnblogs.com/springxian/p/13443054.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!