03丨Java虚拟机原理:JVM为什么被称为机器(machine)?
该思维导图由 AI 生成,仅供参考
JVM 的组成构造
- 深入了解
- 翻译
- 解释
- 总结
JVM的垃圾回收是Java虚拟机管理内存的重要功能之一。通过可达性分析算法,JVM能够识别并清理不再被使用的对象,释放内存资源。垃圾回收主要有清理、压缩和复制三种方法,同时采用分代回收策略,将堆空间分为新生代和老年代,以提高垃圾回收效率。文章还介绍了不同类型的垃圾回收器,包括串行、并行、并发和G1垃圾回收器,以及它们的适用场景和特点。了解JVM的基本构造和垃圾回收原理有助于解决Java开发中的各种问题,如内存溢出、栈空间不足等,同时也能优化程序性能。通过思考和分析问题,开发者可以更深入地理解JVM和整个计算机的原理体系,提高对Java开发的认识和领悟。
《后端技术面试 38 讲》,新⼈⾸单¥59
全部留言(36)
- 最新
- 精选
- 幸福来敲门老师,内存溢出和内存泄漏有什么区别,以java为例??
作者回复: 内存溢出是说程序需要申请的内存超过了JVM当前可以分配的最大内存,溢出。 内存泄漏是说期望被回收的内存对象没有被回收,泄漏。 内存泄漏持续发生,很可能引起内存溢出。
2019-11-22264 - KL3请问老师,关于类加载,对象方法和类方法都是放在方法区吗?
作者回复: 可执行的代码都在方法区。 对象是类的实例,实例变量在堆中,同一个类的所有对象实例的方法只有一份,在方法区。
2019-11-2248 - 乘坐Tornado的线程魔法师存活对象从From区复制到To区之后,在交换名称之前,是不是要把From区的那些不存活对象全部回收?(保证交换名字之后,To区永远是空白的)
作者回复: 内存空间只需要标记是空闲就可以,交换以后To区就已经是空白的了。
2019-11-2245 - 乘坐Tornado的线程魔法师操作系统处理线程栈这个场景是不是可以想象成,高并发场景下,每一个请求都要压入操作系统的线程栈,请求返回后,执行这个请求的线程才能从操作系统的线程栈中出栈?
作者回复: 每个线程有自己的线程栈,用来管理方法的局部变量。而线程本身的管理不需要用栈。 事实上,线程是使用线程池管理的,请求到来,就到线程池中申请分配一个空闲线程,请求处理完,线程放回到空闲线程池中。
2019-11-225 - WoLoong老师你好 1.为什么新生代要设置3个区域呢?只有from和to不行吗? 2.多线程执行的时候,栈帧在栈上如何分配空间的,是分多个java栈吗?
作者回复: 1 因为一个对象在from和to之间多次拷贝,然后才会放入老年代。 2 每个线程有自己的线程栈。
2019-11-2374 - 我爱布丁老师,第一讲中谈到当操作系统载入编译后程序时,会在内存中建立进程,划分代码段,堆,栈等。那么当操作系统运行JAVA虚拟机加载类文件时,在虚拟机中的Java堆,栈是否会直接map到JAVA虚拟机进程的堆,栈呢?从操作系统看一个JAVA虚拟机进程,和一个普通的编译后程序进程结构上有区别吗?
作者回复: 虚拟机内部的堆和栈不会map到操作系统的堆和栈,这样才能跨平台。 操作系统看JVM就是一个普通进程。
2019-11-2244 - 李怡尚文中垃圾回收只说了堆内存的回收,没有说方法区和栈内存的回收?
作者回复: 方法区是堆的一部分 栈是线程私有的,不需要回收
2021-03-152 - 花不不如果在方法内创建了一个对象实例,这个对象实例信息将会被存放到堆里,而对象实例的引用,也就是对象实例在堆中的地址信息则会被记录在栈里。 - - - - 堆里面存储的对象实例在复制的过程中地址信息不会变化吗?如果变化了怎么通知到java栈呢
作者回复: 可以粗暴理解:有专门机制记录新旧地址。
2021-02-21 - 席席老师,你说Service和Dao都被设计成无成员变量,所以线程安全,这里的Service和Dao指的是接口还是实现类,如果是实现类那么必然会有成员变量呀,有点疑惑🤔
作者回复: 实现类。 成员变量也是无状态的,递归无状态~
2021-02-18 - miracle虽然这个对象被放置在堆中,但是这个对象不会被其他线程访问到,也是线程安全的。 请问下,多个线程都可以访问这个方法,进而可以操作堆中的对象,为什么是线程安全的
作者回复: 每个线程都可以访问这个方法,如果在这个方法内创建一个对象,那么就意味着“每个”线程都会“自己”创建一个对象。线程之间不会访问彼此的对象。
2019-11-234