JVM组成

大家好我是小明,今天学习JVM


文章目录

  • 1.什么是程序计数器?(高频)
  • [2. 什么是Java堆???](#2. 什么是Java堆???)
  • [3. 什么是虚拟机栈(高频)???](#3. 什么是虚拟机栈(高频)???)
  • [3. 方法内局部变量是否是线程安全的??](#3. 方法内局部变量是否是线程安全的??)
  • [4. 什么情况下会导致栈帧溢出??](#4. 什么情况下会导致栈帧溢出??)
  • [5. 垃圾回收是否涉及栈内存???](#5. 垃圾回收是否涉及栈内存???)
  • [6. 堆和栈的区别是什么???](#6. 堆和栈的区别是什么???)
  • [7. 能不能解释一下方法区??](#7. 能不能解释一下方法区??)

学习大纲


1.什么是程序计数器?(高频)

核心定义与作用

存储下一条要执行的指令地址

线程私有的,每个线程一份,内部保存的字节码的行号。用于记录正在执行的字节码指令的地址。

2. 什么是Java堆???

java8堆的介绍

  • 线程共享: Java 堆是 JVM 中少数所有线程都能访问的共享内存区域,不存在线程私有之分。比如多个线程同时操作同一个全局对象,这个对象就存储在 Java 堆中。

  • 对象的 "大本营": 你用 new 关键字创建的几乎所有对象实例和数组,都在 Java 堆中分配内存(比如 new String("hello")、new int[100])。

  • 垃圾回收的核心区域: 别并回收这些无用对象的内存,释放空间供新对象使用。

java8堆


新生代: 刚创建、生命周期很短的对象,分为Eden 区、S0 区、S1 区,在新生区垃圾回收频率高速度快。

老年代: 从新生代存活下来、生命周期长的对象,无进一步细分。在老年代垃圾回收回收频率低、耗时久。

java7和java8的堆的区别

Java 7: 方法区的实现是永久代(PermGen),它是 Java 堆的一部分,有固定大小限制。

存储内容:类元数据、运行时常量池、字符串常量池、静态变量等。

java 8: 彻底移除了永久代,改用 ** 元空间(Metaspace)** 来实现方法区。

存储位置:元空间使用本地内存(Native Memory,即操作系统直接内存),不再属于 Java 堆。

为什么要这样做??

节省堆的空间防止OOM(内存溢出)


3. 什么是虚拟机栈(高频)???

  • 每个线程运行时所需要的内存,称为虚拟机栈,先进后出
  • 每个栈由多个栈帧(frame)组成,对应着每次方法调用时所占用的内存
  • 每个线程只能有一个活动栈帧,对应着当前正在执行的那个方法


一个线程一个栈,调用方法进栈,跳出方法出栈。


3. 方法内局部变量是否是线程安全的??


4. 什么情况下会导致栈帧溢出??

  • 栈帧过多导致内存溢出, 如: 递归调用
  • 栈帧过大导致内存溢出

5. 垃圾回收是否涉及栈内存???

垃圾回收主要涉及堆内存,栈垃圾回收机制是:方法出栈回收


6. 堆和栈的区别是什么???

  • 栈内存一般用来存储局部变量和方法调用,但堆内存是用来存储java对象和数组的,堆会GC垃圾回收,栈不会。

  • 栈内存是线程私有的,而堆内存是线程公有的。


7. 能不能解释一下方法区??

方法区是jdk1.7的说法,jdk1.8后就把他改成元空间,并且从堆中移动到本地内存中去了,但是他们的作用是一样的,目的是节省堆内存。

  • 方法区是各线程共享内存区域
  • 主要存储类的信息,运行时常量池
  • 虚拟机启动的时候创建,关闭虚拟机时释放

什么是运行时常量池

这是方法区(元空间 / 永久代)的核心组成部分,属于线程共享的内存区域

  • 常量池:可以看作是一张表,虚拟指令会根据这张常量表找到要执行的类名、方法名、参数类型、字面常量等信息
  • 当类被加载,它的常量池信息就会放入运行时常量池

好了今天就到这里

相关推荐
sinat_255487811 天前
泛型·学习笔记
java·jvm·数据库·windows·python
「QT(C++)开发工程师」1 天前
C++17三大实用特性详解:折叠表达式、结构化绑定与constexpr if
jvm·c++
minji...1 天前
Linux 多线程(五)用C++语言以面向对象方式封装线程
linux·运维·服务器·网络·jvm·数据库
她说..2 天前
Java 基本数据类型高频面试题
java·开发语言·jvm·spring boot
明灯伴古佛2 天前
面试:什么是可重入性?为什么 synchronized 是可重入锁?
java·jvm·面试
PrDf22Iw82 天前
编译执行与解释执行的区别是什么?JVM 使用哪种方式?
jvm
!停2 天前
C++入门—内存管理
java·jvm·c++
Engineer邓祥浩2 天前
JVM学习笔记(5) 第二部分 自动内存管理 第4章 虚拟机性能监控、故障处理工具
jvm·笔记·学习
woai33642 天前
JVM学习-基础篇-垃圾回收
java·jvm·学习
aP8PfmxS22 天前
Lab3-page tables && MIT6.1810操作系统工程【持续更新】
java·linux·jvm