JVM知识点总结

介绍一下java内存区域(运行时数据区)

java对象的创建过程(五步,建议能默写出来并且要知道每一步虚拟机都做了什么)

对象的访问定位的两种方式(句柄和直接指针两种方式)

扩展问题:String类和常量池 ;8中基本数据类型的包装类和常量池

运行时数据区:线程共享、线程私有、直接内存

线程共享:

堆:内存中最大的一块区域。也是垃圾收集器管理的主要区域,因此也被称为GC堆。是所有线程共享的一块内存区域,在虚拟机启动时创建。
目的:存放对象实例,几乎所有的对象实例以及数组都在这里分配内存。
GC堆:新生代、老年代;Eden空间、From Survivor、To Survivor空间等。
jdk1.7及之前:新生代内存、老年代、永久代
jdk1.8:永久代被移除,取而代之的就是元空间。
堆容易出现的就是OOM,表现方式有:
1:OOM:GC Overhead Limit Exceeded:当JVM花太多时间执行垃圾回收并且只能回收很少的堆空间时
2:java.lang.OOM:java heap space:在创建新对象时,堆内存中的空间不足以存放新创建的对象时。
方法区:用于存储已被虚拟机加载的类信息、常量、静态常量、即时编译器编译后的代码等数据。方法区也被称为永久代。
方法区和永久代的关系就好比java中接口和类的关系,方法区是java虚拟机规范中的定义,而永久代是一种实现。
为什么要将永久代替换Wie元空间呢?
整个永久代有一个JVM本身设置固定大小上限,无法进行调整,而元空间使用的是直接内存,受本机可用内存的限制,虽然元空间仍旧可能溢出,但是比原来出现的几率会更小。元空间溢出:java.lang.OOM:MetaSpace
直接内存:并不是虚拟机运行时数据区域的一部分,也不是虚拟机规范中定义的内存区域。

线程私有:

程序计数器:一小块内存空间,可以看作是当前线程所执行的字节码的行号指示器。(为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,各线程之间计数器互不影响,独立存储)
作用:字节码解释器通过改变计数器来依次读取指令,从而实现代码的流程控制;在多线程的情况下,程序计数器用于记录当前线程执行的位置,从而达到线程切换时的位置。
注意:程序计数器是唯一一个不会出现OOM的内存区域。随着线程的创建而创建,随着线程的结束而死亡。
虚拟机栈:java内存分为堆内存和栈内存,栈就是虚拟机栈。由一个个栈帧组成,而每个栈帧中都拥有:
局部变量表:主要存放了编译期可知的各种数据类型(八种基本类型)、对象引用(不同于对象本身,也可能是一个指向对象起始地址的引用指针,也可能是指向一个代表对象的句柄或其他与此对象相关的位置)
操作数栈:
动态链接:
方法出口信息:
会出现的错误:
StackOverflowError:若java虚拟机栈的内存大小不允许动态扩展,那么当线程请求栈的深度超过当前java虚拟机栈的最大深度的时候
OutOfMemoryError:java虚拟机栈的内存大小可以动态扩展,如果虚拟机在动态扩展栈时无法申请到足够的内存空间。
java方法和函数调用原理:java栈可用类比数据结构中栈,java栈中保存的主要内容是栈帧,每一次函数调用都会有一个对应的栈帧被压入java栈,每一个函数调用结束后,都会有一个栈帧被弹出。

本地方法栈:虚拟机栈为虚拟机执行java方法服务,而本地方法栈则为虚拟机使用到的native方法服务。
java对象的创建过程:类加载检查》分配内存》初始化零值》设置对象头哦》执行init方法

String s = new String(“abc”);
将创建1个或者2个字符串对象。如果池中已存在字符串常量“abc”,则只会在堆空间创建一个字符串常量“abc”。如果池中没有字符串常量“abc”,那么它将首先在池中创建,然后在堆空间中创建,因此将创建2个字符串对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值