目录
1、JDK
Java Development Kit,Java开发工具包,包含JRE、开发工具(javac编译、java运行、jdb调试、jar打包);
2、JRE
Java Runtime Environment,Java运行时环境,包含JVM、核心类库、运行工具java;
3、JVM
Java Virtual Machine,Java虚拟机,是Java程序正真运行的地方,也是Java语言跨平台一次编译多处运行的关键,想要在哪个操作系统运行,则只需要安装对于的JVM(JRE)就行。
以简单HelloWorld程序为例,写好.java文件后,经过JDK中的javac编译工具编译生成.class字节码文件,然后在JVM中调用需要的核心类库,解释运行,生成机器码执行出结果。
(1)JVM的跨语言特性
因为JVM跟语言没有直接关系,只识别class字节码文件,Java的.class就是一种字节码文件,还有像Kotlin语言编译成字节码文件后也可以在JVM上运行。
(2)垃圾回收机制(GC)
主要针对堆内存回收,JVM自动干活,方便程序员管理内存;
针对堆区新生代minorGC,针对堆区老年代majorGC;
确定哪些是可回收:
引用计数法:每一个创建的对象都有一个引用计数器,表示该对象有几个引用指向它,当计数器为零时,表示没有引用指向,就是没有用了,则就可被回收。缺点:当两个对象互相引用时,引用计数器不可能为零,所以永远无法回收。
可达性分析算法:从整个堆内存跟对象出发,依次判断有哪些对象是可达的,不可达即无法访问,被回收。
堆内存:是JVM中最大的内存空间,用于存放所创建的对象,包含常量池。
栈内存:存放基本类型的变量、引用类型的的引用。
方法区:存放类信息、静态变量、静态方法。
(3)内存溢出(OOM)
Out Of Memory,是指JVM可用内存不足(先回收,回收还不足时),导致出现异常。
栈溢出:StackOverflowError,栈溢出异常,举例:死递归引起。
堆溢出:OutOfMemoryError,堆内存溢出异常,举例:创建String数组,大小大于设置的堆内存大小。
JVM启动参数:-Xmx4g最大 -Xms4g最小。
方法区溢出、本机直接内存溢出。
(4)内存泄漏
Memory Leak,是指本来无用的对象占用着内存不释放的情况。
典型场景:每当请求进来都分配了内存,但有一部分未能回收,那么随着处理的请求越来越多,内存泄漏也就越来越严重。
(5)内存溢出与内存泄漏的关系
当内存泄露严重时,随着时间的推移一定会发生内存溢出;
内存泄露是资源管理问题和程序bug;
内存溢出是内存空间不足和内存泄漏的最终结果。
标签:面试题,Java,JRE,回收,内存,JVM,溢出 From: https://blog.csdn.net/m0_63927940/article/details/137217535