jvm 问答
jvm规范下载:Java SE Specifications (oracle.com)
【20230831】
1、MESI协议:保持一致性,在cpu缓存中设置一个标记位,有四种状态:
Modify:修改缓存,cpu的缓存已经被修改了,与内存不一致
Exclusive:独占缓存,cpu缓存和内存中数据一致,并且其他处理器没有可使用的缓存数据
Share:共享缓存,和内存保持一份一致的复本,多组缓存可以同时拥有 针对同一个内存地址的共享缓存段
Invalid:失效缓存,cpu的这个缓存不可用了
【20230823】
1、youngGC频繁,怎么调优
原因可能是对象频繁创建和销毁,可以查看gclog,分析堆(jstat,jmap)
解决:-Xmn 修改young区大小;选择合适的gc回收器 -XX:+UseConcMarkSweepGC选择合适的gc
2、
【his】
1、jvm的组成部分(这个有点乱?)
class loader 类加载器
exctution engine 执行引擎也叫解释器,解释指令,交给操作系统执行
native interface 本地方法接口,融合其他语言的方法,为java所用
runtime data area :运行时数据区,jvm重点, 我们写的程序都加载到这里 才开始执行
stack 栈内存:启动一个线程就有一个栈,不用回收,调用一个方法就压入一个栈帧?线程结束后栈销毁 √
heap 堆内存 :一个jvm实例只有一个堆内存。类 方法 常变量等放在这里,分为三部分: 永久存储区(jdk自带的类,接口等的元数据,存储的是运行环境必须的类信息,不会回收,关闭jvm才会释放此区域的内存,jdk8后叫元空间),新生代,老生代 √
method area 方法区: 被所有线程共享,保存字段,字节方法码,特殊方法例如构造函数,接口代码也在这里定义 √
pc 程序计数器:每个线程都有一个,指向方法区的方法字节码,由执行引擎读取下一条指令 √
=
=
method area是概念,永久代或元空间 是 方法区的具体实现
2、运行时数据区包含哪些(可以参看jvms 规范)
pc:程序计数器,每个线程有一个
jvm stack:一个线程一个
heap:线程共享,类实例和数组在这里分配
method area:方法区,线程共享
run-time constant pool:运行时常量池 这个也是从方法区分配而来的
natice method stack:本地方法栈
下图为 jvms7
3、队列和栈的区别
都用于预存储数据,队列先进先出。有例外情况,deque允许两端检索 ??
栈先进后出
4、什么是双亲委派模型
先说类加载:
bootstreap classloader:java_home/lib下面的
其他类加载:
扩展加载:java_home/lib/ext 下面的
应用程序类加载:负责加载用户路径上指定的类库,没有自定义类加载器,就默认使用这个
========
双亲委派模型:类加载器收到加载请求时,自己先不加载,优先让父类加载,等他们找不到,自己再动手
5、类加载的过程
加载:根据查找路径,找到class文件,并导入
检查:检查文件格式
准备:给类里面的静态变量 分配内存空间
解析:虚拟机把符号引用替换为直接引用,符号引用就是一个标示,直接引用执行 内存中的地址
初始化:静态变量,静态代码块执行初始化工作
6、怎么判断对象可以被回收
引用计数器:不能解决循环依赖
可达性分析:GC root向下检索,搜索所走过的路径称为引用链。没有路径了 则可以回收
7、java的引用类型(作用是啥?)
强引用:gc时不会被回收
软:有用但不是必须的对象。内存溢出前会回收
弱:有用但不是必须的对象。下次gc时会回收
虚:phantomreference ,gc时返回一个通知
例如 弱引用解释 可以看这里
8、jvm有哪些垃圾回收算法
标记-清除:标记没用的对象,清除。 缺点是 有内存碎片
标记-整理:标记没用的,让活对象 向一端移动,再清除标记以外的内存
复制:空间划分成2份,当一块用完后 复制活对象到另外一块。缺点是 内存使用减少了一半,使用率不高。
分代:根据对象存活周期 划分为几部分,一般为 新生代和老年代,新生代一般使用 复制算法,老年代一般使用 标记-整理。??为什么呢
新生代分为 3块,eden区,survivor1,survivor2 80,10,10。 只空闲了10,用来腾挪
9、jvm有哪些垃圾回收器
serial:单线程顺序
serial old:单线程,serial的老年版本。cms的备选
parnew:serial的 多线程版本
parallel:多线程。优先吞吐量,牺牲等待时间换取系统吞吐量
parallel old:parallel的老生代版本,parallel 是复制,old是标记整理
CMS:获取最短停顿时间为目标,适合B/S
G1:兼顾吞吐量和等待时间,jdk9默认
=
minor GC:清除年轻代
major GC:清除老年代
full GC:清除整个堆空间,包括年轻代,年老代和 永久代
10、CMS 垃圾回收器
concurrent mark-sweep,牺牲吞吐量来达到 最短回收停顿时间。可以用 -XX:+UseConcMarkSweepGC 来指定cms回收器
用的是标记-清除,可能会有内存碎片,如果剩余内存不足以支持程序运行,出现concurrent mode fail,临时 cms 会用 serial old 进行垃圾清除,性能会降低
11、新生代和老年代垃圾回收器有哪些,有啥区别
新生代 1/3:serial,parNew,parallel scavenge 一般采用 复制算法,优点是效率高,缺点是 内存利用率低
老年代 2/3:serial old, cms,parallel old 一般 标记-整理,
整堆回收:G1
新生代中,eden,to survivor from survivor 8:1:1
1)eden+ from 的活对象 存入到 to (每次from到to时,年龄加1,达到15-默认 后,升级到老年代,大对象直接进老年代)
2)清空eden
3)from和 to交换
12、jvm调优工具
jconsole:对jvm里面的 类,内存,线程 监控
jvisualvm:内存快照,线程快照,程序死锁,监控内存变化,监控gc变化
13、怎么获取java程序使用的内存,堆使用的百分比
java.lang.Runtime 获取最大内存,总内存,剩余内存。 这些是堆内存吗??
14、64位计算机,int的长度
长度与计算机位数无关,int都是 32位
15、serial和parallel,在执行gc的不同之处
都会出现 stop the world
serial是默认的复制收集器,一个gc线程
parallel是多个gc线程
16、softReference和weakReference的区别
两个都可以提高gc和内存效率
弱引用,一旦失去了最后一个强引用,就会回收
软引用 虽然不能阻止回收,但是可以延迟到 内存不足时才回收
17、weakHashMap是怎么工作的
和hashmap一样,不同的是,她用 弱引用作为key,key对象没有任何引用了,k/v都会回收
18、JVM选项-XX:+UseCompressedOops 作用
32位的jvm迁移到64位时,对象的指针从32变为 64,堆内存几乎翻倍
可以通过这个参数,指定用32位的oop,而不是64位的
检查某些系统属性如 sun.arch.data.model 或 os.arch 来获取该信息 可以判断jvm是32还是64的
19、jvm中,类加载器和类限定名,才能确定类的唯一性?
jsp为何能实时生效,与类加载器实例不同 有关系?
哪个,违反了 双亲委派,tomcat?
参考地址
https://baijiahao.baidu.com/s?id=1701989545421607568&wfr=spider&for=pc
=======================
备注:公众号清汤袭人能找到我,那是随笔的地方