JVM

1.JVM内存模型

在这里插入图片描述

  1. 程序计数器:记录了线程执行的字节码行号。
  2. java虚拟机栈:每个方法执行的时候都会创建一个栈帧(stack frame)用于存放局部变量表、操作栈、动态链接、方法出口。每一个方法从调用直至执行完成的过程,就对应一个栈帧在虚拟机中入栈到出栈的过程。局部变量表所需的内存空间在编译期间完成分配,在方法运行期间不会改变局部变量表的大小。存在StackOverflowError(超过栈深度)和OutOfMemoryError(动态扩展内存不足)异常。
    局部变量表是一组变量值存储空间,用于存放方法参数方法内部定义的局部变量
  3. 本地方法栈:与虚拟机栈很类似,区别是一个是执行Java方法,一个是执行本地方法。
  4. Java堆:Java堆是Java虚拟机所管理的内存最大的一块,被所有线程共享的一块内存区域,在虚拟机启动的时候就创建了。此内存区域的唯一目的就是存放对象实例
    Java堆是垃圾收集器管理的主要区域。因为现在收集器基本都采用分代收集算法,所有Java堆还可以细分为:新生代和老年代,再细致一点有Eden空间、From Survivor空间、To Survivor空间等。如果在堆中没有内存完成实例分配,并且堆也无法再扩展时,会抛出OutOfMemoryError异常。
  5. 方法区:用于存储已被Java虚拟机加载的类信息、常量、静态变量、及编译器编译后的代码等数据。
    运行时常量池:属于方法区的一部分,Class文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池,用于存放编译器生成的各种字面量和符号引用,这部分内容将在类加载后进入方法区的运行时常量池中存放。

JDK1.8中进行了较大改动:
1.移除了永久代(PermGen),替换为元空间(Metaspace);
2.久代中的 class metadata(类元数据) 转移到了做“Metaspace”的Native memory(本地内存,而不是虚拟机);
3.久代中的 interned Strings(字符串常量) 和 class static variables(类静态变量)转移到了Java heap;
4.永久代参数 (PermSize MaxPermSize) -> 元空间参数(MetaspaceSize MaxMetaspaceSize)
metaspace并不是全部用来放类对象的。比如说,因为每一个ClassLoader都被分配了一块内存,这块内存可能并没有被用完,于是就会有一些内存碎片;metaspace还需要放所谓静态变量。所以,class space是指实际上被用于放class的那块内存的和。

2内存泄漏,内存溢出?

  1. 内存泄漏:是指程序在申请内存后,无法释放已申请的内存空间,内存泄漏堆积后的后果就是内存溢出。
  2. 内存溢出 :指程序申请内存时,没有足够的内存供申请者使用
    内存泄漏的根本原因?
  3. 长生命周期的对象持有短生命周期对象的引用就很可能发生内存泄漏

##如何排查内存溢出故障?

JVM 年轻代到年老代的晋升过程的判断条件?

  • 经过第一次Minor GC后仍然存活,将被移动到Survivor空间中,并且对象年龄设为1。
  • 在Survivor区中每“熬过”一次Minor GC,年龄就增加1岁,当它的年龄增加到一定程度(默认为15岁),就将会被晋升到老年代中。
  • 如果Survivor空间中相同年龄所有对象大小的总和大于Survivor空间的一半,年龄大于或等于该年龄的对象就可以直接进入老年代

3 双亲委派模型?

在这里插入图片描述
启动类加载器:JAVA_HOME/lib
扩展类加载器:JAVA_HOME/lib/ext
应用程序类加载器:将系统类路径(CLASSPATH)中指定的类库加载到内存中

4类的实例化顺序?

1. 父类静态成员和静态初始化块 ,按在代码中出现的顺序依次执行
2. 子类静态成员和静态初始化块 ,按在代码中出现的顺序依次执行
3. 父类实例成员和实例初始化块 ,按在代码中出现的顺序依次执行
4. 父类构造方法
5. 子类实例成员和实例初始化块 ,按在代码中出现的顺序依次执行
6. 子类构造方法

5 GC

Minor GC触发条件:
Eden区创建对象,空间不足,触发Minor GC。
算法:复制算法。

Full GC触发条件:

  • 直接调用System.gc
  • 老年代空间不足
  • 方法区空间不足
  • 在Minor GC的时候空间分配担保失败

空间分配担保
在发生minor gc之前,虚拟机会检测 : 老年代最大可用的连续空间>新生代all对象总空间?
1、满足,minor gc是安全的,可以进行minor gc。
2、不满足,虚拟机查看HandlePromotionFailure参数:
(1)为true,允许担保失败,会继续检测老年代最大可用的连续空间>历次晋升到老年代对象的平均大小。若大 于,将尝试进行一次minor gc,若失败,则重新进行一次full gc。
(2)为false,则不允许冒险,要进行full gc(对老年代进行gc)。

Young Gen 进入 Old Gen的条件?
Minor GC 时对象年龄超过设定值数(默认15)。
Young中对象的大小>survivor空间大小的在Minor GC时进入Old Gen。
创建的新对象>设定值时直接进入Old。
Survivor中某一年龄对象的总和大于Survivor空间的一半则触发,不小于该年龄的对象会被移动至Survivor区。

JVM:
https://www.cnblogs.com/aademeng/articles/11104619.html
深入JVM垃圾收集(GC流程)
https://www.jianshu.com/p/be8d3312e780
Java内存区域介绍(附带JDK1.8后方法区的变化):
https://blog.csdn.net/weixin_42762133/article/details/95735737

6.其他

6.1 栈帧:
局部变量表、操作数栈、方法出口(方法返回值通过方法出口返回)、其他

6.2
执行引擎根据程序计数器指向的地址(字节码行号)执行具体指令

7. GC

7.1 可达性分析算法的GCRoots:

  • 虚拟机栈中(栈帧中的本地变量表)引用的对象;
  • 本地方法栈中引用的对象;
  • 方法区中静态类属性引用的对象;
  • 方法区中常量引用的对象;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值