JVM 有哪些内存区域?(JVM 的内存布局是什么?)
JVM 包含堆、元空间 Java 虚拟机栈、本地方法栈、程序计数器等内存区域。其中,堆是占用内存
最大的一块。我们平常的-Xmax、-Xms 等参数,就是针对于堆进行设计的。
1.堆:JVM 堆中的数据,是共享的,是占用内存最大的一块区域
2、虚拟机栈:Java 虚拟机栈,是基于线程的,用来服务字节码指令的运行
3、程序计数器:当前线程所执行的字节码的行号指示器
4、元空间:方法区就在这里,非堆本地内存:其他的内存占用空间
Java 的内存模型是什么?(JMM 是什么?)
JVM 试图定义一种统一的内存模型,能将各种底层硬件及操作系统的内存访问差异进行封装,使
Java 程序在不同硬件及操作系统上都能达到相同的并发效果。它分为工作内存和主内存,线程无
法对主存储器直接进行操作◇一个线程要和另外一个线程通信,只能通过主存进行交换。
JMM 可以说是 Java 并发的基础,它的定义将直接影响多线程实现的机制,如果你想要想深入了解
多线程并发中的相关问题现象,对 JMM 的深入研究是必不可少的。
上面两个问题是经常容易搞混的,但它们的内容却完全不同的。
JVM 垃圾回收时候如何确定垃圾?什么是 GC Roots?
JVM 采用的是可达性分析算法。JVM 是通过 GC Roots 来判定对象的存活的。从 GC Roots 向下追
溯、搜索,会产生一个叫做 Reference Chain 的链条。当一个对象不能和任何一个 GC Root 产生关系,
就判定为垃圾。
GC Roots 大体包括:
1、活动线程相关的各种引用,比如虚拟机栈中栈帧里的引用。
2、类的静态变量的引用。
3、JNI 引用等。
当然也有比较详细的回答,个人认为这些就够了。详细版本如下:
1、 lava 线程中,当前所有正在被调用的方法的引用类型参数、局部变量、临时值等。也就是与
我们栈帧相关的各种引用。
2、所有当前被加载的 Java 类。
3、Java 类的引用类型静态变量。
4、运行时常量池里的引用类型常量(String 或 Class 类型)。