当前位置:首页 > 虚拟机 > 正文

虚拟机jvm知识点


一、java基础知识点

Java基础知识总结如下:

、JRE和JVM之间的关系。

JDK(Java开发工具包)。):Java开发工具包jdk,是所有Java开发的核心。它集成了jre和一些有用的小工具(、、等)。

JRE(JavaRuntimeEnvironment):Java运行时环境。它主要包含两部分:标准的jvm实现和一些核心Java类库。与jvm相比,它还有额外的特性——它是Java类库的一部分。

JVM(JavaVirtualMachine):Java虚拟机。它仅识别类型的文件。它可以识别类文件中的字节码指令并调用操作系统的上游API来执行操作。所以jvm是Java跨平台能力的核心。

JRE>JVM

2.==和equal()有什么区别?

比较运算符是什么==

==如果被比较的两个操作数都是数值类型,即使它们的数据类型不同,前提是它们的值也相等返回真。如果两个操作数都是引用类型,那么只有两个引用变量的类型具有父子关系才能进行比较,并且两个引用必须指向同一个对象,true才会相等。returns(这里们可以理解为==比较两个变量的内存地址)

什么是equals()方法

equals()方法是Object类的方法。在Object中,类中的equals()方法实际上返回的是使用==进行比较的结果。但我们知道,所有的类都继承自Object,并且当我们使用When时,Object上的equals()方法并没有被Final关键字修饰。相对于equality()方法,我们需要注意这个类是否重写了Object中的equality()方法。


二、jvm堆内存和非堆内存(小白入门文,各博客视频基础总结)

1:堆内存和非堆内存的定义
Java虚拟机有一个堆(Heap)。堆是运行时数据区域,所有类实例和数组的内存都是从那里分配的。。堆是在Java虚拟机启动时创建的。在JVM中,堆外的内存成为非堆内存。
堆内存及相应的垃圾回收算法
1.堆大小可以是固定的,也可以扩展和收缩。堆内存不需要是连续的空间。
2.创建物品后进入伊甸园。年轻一代分为伊甸园(Eden)和幸存者(Survivor)。Survivor由FromSpace和ToSpace组成。Eden区占据大容量,Survivor区占据小容量。默认比例为8:1:1。
MinorGC:使用复制算法。首先将Eden区和ServivorFrom区中存活的对象分配到ServivorTo区(如果对象年龄达到老年代标准/ServivorTo位置不够,则复制到老年代),同时将对象的年龄object+1,然后删除Eden和ServivorFrom中的对象。然后ServivorTo和ServivorFrom互换。
3.老年代
老年代存储的是生命周期较长的内存对象。
Legacy对象相对稳定,不会频繁发生GC。在MajorGC之前,通常会先执行MinorGC,以便新生代对象进入老年代,只有在空间不足时才会触发。当无法找到足够大的连续空间来分配给新对象时,会提前触发MajorGC进行垃圾回收。
MajorGC:如果使用CMS收集器,请使用品牌扫描算法。首先,扫描老年代并标记所有可回收项目。标记完成后,所有标记的物品将被统一回收。同时,会产生不连续的内存碎片。过多的碎片会导致程序以后需要分配更大的对象时无法找到足够的连续内存,而不得不重新启动GC。否则,使用标记压缩算法。
标记-挤压:标记可回收的对象后,将不可回收的对象移动到一端,然后擦除标记的对象。
当老年代已满无法加载时,抛出MOO异常。
二:永久代
内存中永久保存的区域主要存储类和元数据信息。该类在加载时被放置在永久区域中。与存储实例的区域不同,GC在主程序运行时不会清理永久区域。因此,这也会导致永久构建区域随着更多类的加载而被填满,从而导致OOM被删除。
在Java8中,永久代已经被移除,取而代之的是一个称为“元数据区”(metaspace)的区域。
元空间的本质和永久代类似,都是JVM方法域的实现。然而,元空间使用本地内存,永久生成是在JVM虚拟机中完成的。因此,默认情况下,元空间大小受本地内存限制。类元数据放置在本机内存中,类的字符串常量池和静态变量放置在Java堆中。这样,可以加载的元数据类的数量就不再由MaxPermSize控制,而是由.系统的实际可用空间。
1Metaspace解决了永久代OOM问题。元数据和类对象在持久代中容易出现性能问题和内存溢出。
类型2方法信息的大小等很难确定。很难指定永久代的小溢出和老年代的大溢出的大小。
3永久代会给GC带来不必要的复杂性,回收效率低。
三:设置堆内存参数
1.-Xms设置初始分配内存大小,默认物理内存为1/64
2.-Xmx设置最大分配内存,物理内存默认内存is1/4longmaxMemory=time().maxMemory();longtotalMemory=time().totalMemory();n("分配的最大内存"+maxMemory/(double)1024/1024+"MB"+maxMemory/(double)1024/1024/1024+"GB");n("默认分配内存"+totalMemory/(double)1024/1024+"MB"+totalMemory/(双)1024/1024/1024+"GB");