![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
jvm面试
jvm面试
WD技术
这个作者很懒,什么都没留下…
展开
-
Java的四种引用,强弱软虚,用到的场景
https://blog.csdn.net/u011860731/article/details/48714321原创 2022-03-06 10:05:57 · 114 阅读 · 0 评论 -
内存泄漏和内存溢出有什么区别
内存溢出(Out Of Memory) :就是申请内存时,JVM没有足够的内存空间。通俗说法就是去蹲坑发现坑位满了。内存泄露 (Memory Leak):就是申请了内存,但是没有释放,导致内存空间浪费。通俗说法就是有人占着茅坑不拉屎。内存泄漏的情况:1、静态集合类引起内存泄漏静态集合的生命周期和 JVM 一致,所以静态集合引用的对象不能被释放。2、变量不合理的作用域一个变量的定义作用域大于其使用范围,很可能存在内存泄漏;或不再使用对象没有及时将对象设置为 null,很可能导致内存泄漏的发生.原创 2022-03-05 10:44:21 · 397 阅读 · 0 评论 -
JVM中对象如何在堆内存分配
在单线程的情况下1、指针碰撞(Bump The Pointer):内存规整的情况下;分配空间的工作只是将指针像空闲内存一侧移动对象大小的距离即可。2、空闲列表(Free List):内存不规整的情况下;这种适用于内存非规整的情况,这种情况下JVM会维护一个内存列表,记录哪些内存区域是空闲的,大小是多少。给对象分配空间的时候去空闲列表里查询到合适的区域然后进行分配即可。选择哪种分配方式由Java堆是否规整决定,而Java堆是否规整又由所采用的垃圾收集器是否带有空间压缩整理(Compact)的能力决定原创 2022-03-03 09:06:53 · 122 阅读 · 0 评论 -
为什么不要使用finalize方法
(1)无法保证什么时间执行。(2)无法保证执行该方法的线程优先级。(3)无法保证一定会执行。(4)如果在终结方法中抛出了异常,并且该异常未捕获处理,则当前对象的终结过程会终止,且该对象处于破坏状态。(5)影响GC的效率,特别是在finalize方法中执行耗时较长的逻辑。(6)有安全问题,可以进行终结方法攻击。...原创 2022-03-03 09:07:04 · 157 阅读 · 0 评论 -
JVM有哪些类加载器?
站在Java虚拟机的角度来看,只存在两种不同的类加载器:1、启动类加载器(Bootstrap ClassLoader),使用C++语言实现,是虚拟机自身的一部分;2、其他所有的类加载器,由Java语言实现,独立存在于虚拟机外部,并且全都继承自抽象类java.lang.ClassLoader;站在Java开发者的角度来看,自JDK 1.2开始,Java一直保持着三层类加载器架构;JVM中不同的类加载器加载哪些文件?1、启动类加载器(Bootstrap ClassLoader):(根的类加载器)C+原创 2022-03-02 07:43:17 · 990 阅读 · 1 评论 -
jvm 9种垃圾收集器
如上图,一共有7种作用于不同分代的垃圾收集器,如果两个收集器之间存在连线,则说明它们可以搭配使用,垃圾收集器所处区域表示它是属于新生代收集器还是老年代收集器;新生代收集器:Serial、ParNew、Parallel Scavenge [ˈpærəlel] [ˈskævɪndʒ]老年代收集器:CMS、Serial Old、Parallel Old整堆收集器: G1垃圾收集器的最前沿成果:ZGC 和 Shenandoah补充:https://blog.csdn.net/m0_38032942/a.原创 2022-03-02 07:43:35 · 99 阅读 · 0 评论 -
JVM - 常见的JVM种类
HotSpot VMHotSpot VM是绝对的主流。大家用它的时候很可能就没想过还有别的选择,或者是为了迁就依赖了Oracle/Sun JDK某些具体实现的烂代码而选择用HotSpot VM省点心。Oracle / Sun JDK、OpenJDK的各种变种(例如IcedTea、Zulu),用的都是相同核心的HotSpot VM。当大家说起“Java性能如何如何”、“Java有多少种GC”、“JVM如何调优”云云,经常默认说的就是特指HotSpot VM。可见其“主流性”。JDK8的HotSpot原创 2022-03-02 07:43:49 · 1217 阅读 · 0 评论 -
jvm空间分配担保机制
新生代Minor GC后剩余存活对象太多,无法放入Survivor区中,此时就必须将这些存活对象直接转移到老年代去,如果此时老年代空间也不够怎么办?1、执行任何一次Minor GC之前,JVM会先检查一下老年代可用内存空间,是否大于新生代所有对象的总大小,因为在极端情况下,可能新生代Minor GC之后,新生代所有对象都需要存活,那就会造成新生代所有对象全部要进入老年代;2、如果老年代的可用内存大于新生代所有对象总大小,此时就可以放心大胆的对新生代发起一次Minor GC,因为Minor GC之后即使.原创 2022-03-02 07:45:00 · 653 阅读 · 0 评论 -
JVM内存相关的核心参数?
-Xms Java堆内存的大小;-Xmx Java堆内存的最大大小;-Xmn Java堆内存中的新生代大小,扣除新生代剩下的就是老年代的内存大小;-XX:MetaspaceSize 元空间大小;-XX:MaxMetaspaceSize 元空间最大大小;-Xss 每个线程的栈内存大小;-XX:SurvivorRatio=8 设置eden区 和survivor 区大小的比例,默认是8:1:1;-XX:MaxTenuringThreshold=5 年龄阈值;-XX:+UseConc原创 2022-03-02 07:45:16 · 98 阅读 · 0 评论 -
jvm双亲委派机制
双亲委派模型的工作过程是:如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,每一个层次的类加载器都是如此,因此所有的加载请求最终都应该传送到最顶层的启动类加载器中,只有当上一层类加载器反馈自己无法完成这个加载请求(它的搜索范围中没有找到这个类)时,下一层类加载器才会尝试自己去加载;JDK为什么要设计双亲委派模型,有什么好处?1、确保安全,避免Java核心类库被修改;2、避免重复加载;3、保证类的唯一性;如果你写一个java.lang.Str.原创 2022-03-02 07:46:18 · 126 阅读 · 0 评论 -
jvm 的垃圾回收算法
1.标记-清除算法等待被回收对象的“标记”过程在上文已经提到过,如果在被标记后直接对对象进行清除,会带来另一个新的问题——内存碎片化。如果下次有比较大的对象实例需要在堆上分配较大的内存空间时,可能会出现无法找到足够的连续内存而不得不再次触发垃圾回收。2.复制算法(Java堆中新生代的垃圾回收算法)此GC算法实际上解决了标记-清除算法带来的“内存碎片化”问题。首先还是先标记处待回收内存和不用回收的内存,下一步将不用回收的内存复制到新的内存区域,这样旧的内存区域就可以全部回收,而新的内存区域则是连续.原创 2022-03-02 07:45:32 · 921 阅读 · 0 评论 -
JVM怎么判断对象是否存活
https://blog.csdn.net/qq_29860591/article/details/111244593原创 2022-03-02 07:45:46 · 56 阅读 · 0 评论 -
jvm 什么是对象头,里面有什么
https://blog.csdn.net/weixin_39982236/article/details/110724755原创 2022-03-02 07:46:33 · 1507 阅读 · 0 评论 -
jvm在创建对象时采用哪些并发安全机制
https://blog.csdn.net/m0_48333563/article/details/113783060原创 2022-03-02 07:45:59 · 120 阅读 · 0 评论 -
jvm中有哪些内存区域会发生内存溢出
1、方法区溢出第一种原因:上线的时候MetaSpace区域直接用默认的参数,即根本不设置其大小,这会导MetaSpace区域可能才几十M而已或者设置的比较小,此时对于一个稍微大型系统,因为他有很多自己的类,还依赖了很多外部jar包的类,MetaSpace空间很容易不够的。第二种原因:就是很多人开发系统代码都会用一些cglib之类的技术动态生成一些类,一旦代码没有控制好,导致生成的类过多的时候,就很容易MetaSpace给塞满,进而引起内存溢出。2、虚拟机栈/本地方法栈溢出(1)StackOverf原创 2022-03-03 09:07:14 · 1413 阅读 · 0 评论 -
堆空间大小怎么配置,各区域怎么划分
https://blog.csdn.net/qq_27184497/article/details/119055669原创 2022-03-03 09:07:26 · 106 阅读 · 0 评论 -
jvm有哪些内存区域
1、程序计数器程序计数器是一块很小的内存空间,它是线程私有的,可以认作为当前线程的行号指示器。那么计数器记录虚拟机字节码指令的地址。如果为native【底层方法】,那么计数器为空。这块内存区域是虚拟机规范中唯一没有OutOfMemoryError的区域。2、Java栈(虚拟机栈)栈描述的是Java方法执行的内存模型。每个方法被执行的时候都会创建一个栈帧用于存储局部变量表,操作栈,动态链接,方法出口等信息。每一个方法被调用的过程就对应一个栈帧在虚拟机栈中从入栈到出栈的过程。平时说的栈一般指局..原创 2022-03-03 09:07:36 · 277 阅读 · 1 评论 -
jvm可以运行多种语言吗
可以目前Java虚拟机已经可以支持很多除Java语言以外的语言了,如Kotlin、Groovy、JRuby、Jython、Scala等。之所以可以支持,就是因为这些语言也可以被编译成字节码。而虚拟机并不关心字节码是有哪种语言编译而来的。...原创 2022-03-03 09:07:49 · 177 阅读 · 0 评论 -
jdk jre jvm三者之间的关系
定义JDK(Java SE Development Kit),Java标准开发包,它提供了编译、运行Java程序所需的各种工具和资源,包括Java编译器、Java运行时环境,以及常用的Java类库等。JRE( Java Runtime Environment) 、Java运行环境,用于解释执行Java的字节码文件。普通用户而只需要安装 JRE(Java Runtime Environment)来运行 Java 程序。而程序开发者必须安装JDK来编译、调试程序。JVM(Java Virtual Mech原创 2022-03-01 17:38:39 · 377 阅读 · 0 评论 -
什么是进程什么是线程,他们的区别是什么
定义进程是程序的一次运行过程,进程可以看成程序执行的一个实例,进程是系统进行资源分配和调度的一个独立单位。线程是进程的一个实体,是进程的一条执行路径,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。区别1.地址空间和其他资源(如打开文件):进程间相互独立,同一进程的各线程间共享。某进程内的线程在其他进程内不可见。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,原创 2022-03-01 17:20:08 · 2667 阅读 · 0 评论