JVM

Posted springxian

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JVM相关的知识,希望对你有一定的参考价值。

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的主要内容,如果未能解决你的问题,请参考以下文章

分析定位占用CPU资源高的JVM线程

详解Jvm内存结构

详解Jvm内存结构

详解Jvm内存结构

JVM性能分析工具jstack介绍

JVM性能调优监控工具专题一:JVM自带性能调优工具