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

 

=======================

 

posted @ 2023-08-18 16:19  野鹤闲人  阅读(5)  评论(0编辑  收藏  举报