【Java八股】JVM

打印 上一主题 下一主题

主题 1024|帖子 1024|积分 3072

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
JVM

1. jvm内存区域分为哪些部分

线程私有的:步调计数器、虚拟机栈、本地方法栈
步调计数器:指示当火线程执行到的字节码文件的行号,是线程切换后保证线程能恢复到精确的执行位置的关键
虚拟机栈:用于存储方法调用的数据,由一个个栈帧组成,每个栈帧表示一个方法调用,包罗局部变量表、操作数栈、动态链接、方法返回地址。其中局部变量表用于存储根本数据类型的局部变量和对象的引用,操作数栈用于存储中间计算效果,动态链接用于存储方法的符号引用,用于将符号引用转换为调用方法的直接引用。
线程共享的:堆、方法区、直接内存
堆:最大的一块内存区域,唯一目标就是存储对象实例,险些以是对象实例都在这里分配内存(除了JIT逃逸分析后在栈上分配内存的)。别的堆中还包罗字符串常量池。
方法区:JDK1.8以前,方法区是用堆中的永久代实现的,也就是在堆中分配内存,JDK1.8以后方法区是用元空间实现的,也就是在本地内存中。方法区中包罗类信息、静态变量、运行时常量池。
直接内存:
2. 堆内存分为哪三个部分,对象是如安在堆中晋升的

新生代内存(Eden区、S0区、S1区)
老生代
永久代(用于实现方法区)
对象首先在Eden区分配内存,年事为0;
一次垃圾回收后,假如对象还存活,就让它的年事+1,并将它放在S0或S1;
此后每次垃圾回收后,假如对象还存活,就让它的年事+1;
假如它的年事达到15岁,就晋升到老年代。
别的大对象会直接进入老年代,大对象就是需要大量连续内存空间的对象,例如字符串,数组。
3. 运行时常量池是什么

运行时常量池用于存储编译期生成的各种字面量和符号引用
4. Java类加载的过程

1)加载
由类加载器完成,使用哪个类加载器取决于双亲委派模型。这一步骤主要完成了三件事:
根据类名找到二进制字节流;
将二进制字节流的静态存储结构转为方法区中的动态存储结构;
在内存中生成一个代表该类的class对象;
2)验证
确保二进制字节流的信息符合JVM规范
3)准备
为类变量分配内存并设置初始值;
4)剖析
将符号引用更换为直接引用。(符号引用相当于仅有名称,不指向详细内存地址,符号引用存储在运行时常量池中,转换为直接引用,即内存实际地址后,才能进行详细访问操作)
5)初始化
执行类的初始化方法,即cinit方法
5. Java对象的创建过程

1)类加载检查
先检查该对象对应的类有没有被加载过,假如没有,先辈行类加载过程;
2)分配内存
为对象分配足够的内存,所需内存大小在类加载完成后就可以确定。
分配方式有两种:
第一,指针碰撞
适用于堆内存规整的情况(即没有内存碎片)。用过的内存全部整合到一边,没有用过的内存放在另一边,中间有一个分界指针,只需要向着没用过的内存方向将该指针移动对象内存大小位置即可。
第二,空闲列表
虚拟机会维护一个列表,该列表中会记录哪些内存块是可用的,在分配的时候,找一块儿足够大的内存块儿来划分给对象实例,末了更新列表记录。(这种方式容易造成内存碎片)
3)初始化零值
将分配的内存区域都初始化为零
4)设置对象头
设置对象头信息,包罗它属于哪个类、年事是多少、哈希码是多少等信息。从这里可以看出来,对象的内存分为对象头、实例数据和对齐添补三部分。
5)执行init方法
6. 类加载器是什么,双亲委派模型是什么

类加载器是负责完成类加载的第一步:加载的。每个类都有一个classloader。
直白地说,类加载器就是负责将二进制字节码文件.class文件加载到JVM中,并生成一个class对象。
类加载时不会一次性加载全部的类,而是在用到该类的时候再动态地加载。
类加载器有三种:启动类加载器、扩展类加载器、应用步调类加载器。
启动类加载器是最顶层的加载类,用于加载JDK焦点类库。
扩展类加载器用于加载jar包。
应用步调类加载器用于加载用户编写的类。
那么一个类到底由哪个类加载器去加载呢?这是由双亲委派模型指定的。
每个类加载器都有自己对应的父类加载器。
在classloader的loadClass方法中,双亲委派模型的执行流程如下:
1)首先检查该类是否被加载过,假如加载过,直接返回;
2)调用父类加载器的loadClass方法来加载类,这样根据类加载器的父子关系,全部请求最终会转达到顶层的启动类加载器;
3)当父类加载器反馈自己无法加载这个类时(即它没有搜刮到这个类),子加载器就尝试自己加载;
4)假如子类加载器也无法加载这个类,就抛出非常;
为什么要使用双亲委派模型?
使用双亲委派模型是为了制止类的重复加载。假如不去调用父加载器的loadClass方法,而是每个类自己加载自己的话,那么假如两个类名字类似,就会出现类名类似但实际上不一样的两个类。
7. 死亡对象的判断方法

引用计数法


  • 每当有一个地方引用它,计数器就加 1;
  • 当引用失效,计数器就减 1;
  • 任何时候计数器为 0 的对象就是不可能再被使用的。
这个方法实现简单,服从高,但是目前主流的虚拟机中并没有选择这个算法来管理内存,其最主要的缘故原由是它很难解决对象之间循环引用的问题。
可达性分析法:
用一系列GC Root作为起点,构建对象的引用链。当进行可达性分析时,从GC Root开始向下搜刮,走过的对象即有引用的对象。
而假如从GC Root无法到达对象,就认为此对象是不可用的,需要被回收。
8. 对象的引用类型有哪些

强引用:绝不会被垃圾回收,当JVM内存不足时,纵然抛出OOM也不会回收
软引用:可有可无,JVM内存不足时可能会被回收,JVM内存足够就不会被回收
弱引用:只有弱引用的对象,被JVM发现了就会被回收,不管内存是否足够
虚引用:形同虚设,跟没有引用一样,随时可能被回收
9. 如何判断一个常量是废弃常量

假如在字符串常量池中存在字符串 “abc”,假如当前没有任何 String 对象引用该字符串常量的话,就阐明常量 “abc” 就是废弃常量,假如这时发生内存回收的话而且有必要的话,“abc” 就会被系统清算出常量池了。
10. 如何判断一个类是无用的类,从而发生类卸载?

类卸载即类的class对象被垃圾回收。
类卸载的条件是:
1)该类的全部实例对象都已经被回收;
2)该类没有在其他任何地方被引用;
3)该类的加载器已经被回收;
11. JVM垃圾回收算法有哪些

1)标记扫除算法
标记出全部不需要回收的对象,然后同一回收掉全部没有被标记的。
缺点:服从不高;会产生内存碎片;
2)复制算法
每次仅使用内存区域的一半,这一半使用完后将还存活的对象复制到另一半去,然后将这一半的全部空间清算掉。
缺点:可用内存空间变成了原来的一半,假如对象很大,复制会耗费大量时间。
3)标记整理算法
将存活的对象向一端移动,然后直接清算掉边界以外的全部内存。
缺点:由于要整理,服从也不高,适合老年代这种垃圾回收频率不是很高的场景。
4)分代收集算法
当前虚拟机的垃圾收集都接纳分代收集算法,即根据新生代、老年代等分代,选择不同的垃圾收集算法。对于新生代,GC频率比较高、对象占用内存也不是很多的情况,可以选择复制算法。对于老年代,存活几率比较高,可以选择标记扫除大概标记整理算法。
实际上JVM之以是对对象进行分代,也是为了垃圾回收时可以大概根据不同代对象的特点选择符合的算法。
12. 垃圾回收器有哪些

1)Serial串行收集器
汗青最久长的,单线程的,新生代标记复制算法,老生代标记整理算法
2)Serial Old
Serial收集器的老年代版本
3)并行收集器ParNew
其实就是Serial的多线程版本,仍旧是新生代标记复制算法,老生代标记整理算法
4)Parallel Scavenge
JDK1.8接纳的收集器。同样新生代标记复制算法,老生代标记整理算法,且为多线程。但提供了很多参数资助用户实现最大吞吐量
5)Parallel Old
Parallel Scavenge的老年代版本
6)CMS收集器
CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。它非常符合在注意用户体验的应用上使用。
7)G1收集器
G1 (Garbage-First) 是一款面向服务器的垃圾收集器,主要针对配备多颗处理器及大容量内存的机器. 以极高概率满意 GC 停顿时间要求的同时,还具备高吞吐量性能特性。
12. JVM常用的参数有哪些

指定堆内存大小:-Xms用于指定最小堆内存大小,-Xmx用于指定最大堆内存大小
指定新生代内存:-XX:NewSize最小新生代内存, -XX:MaxNewSize最大新生代内存,-Xmn直接指定新生代内存大小,别的还可以通过-XX:NewRation指定新生代老生代内存比例
指定元空间大小:-XX:MetaspaceSize、-XX:MaxMetaspaceSize
选择垃圾回收器:-XX:+UseSerialGC选择串行收集器、-XX:+UseParallelGC选择并行收集器、-XX:+UseConcMarkSweepGC选择CMS收集器、-XX:+UseG1GC选择G1收集器
还有一些打印日志的参数:
-XX:+PrintGCDetails 打印GC信息
-XX:+PrintGCDateStamps 打印GC信息
-XX:+PrintTenuringDistribution # 打印对象分布
-XX:+PrintHeapAtGC # 打印堆数据

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

伤心客

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表