java面试专题--jvm虚拟机

本文深入探讨了JVM的内存结构,包括进程内存逻辑结构、线程共享与私有区域、栈与堆的区别。讲解了JVM在不同JDK版本的变化,以及方法区的移除原因。此外,还介绍了常见的JVM内存参数设置、内存溢出异常的场景及解决方案,特别是堆、栈、方法区和直接内存溢出。文章还涉及垃圾回收机制、类加载过程,尤其是双亲委派模型及其优势,并讨论了Tomcat的类加载机制和类隔离性问题。
摘要由CSDN通过智能技术生成
1.jvm 进程内存逻辑结构
主要分为三大块
1.堆
2.方法区
3.本地内存

这里写图片描述

2.jvm内存结构

这里写图片描述
程序计数器: 较小的内存空间, 当前线程执行的字节码的行号指示器(对java多线程起关键作用,多线程程序会不断切换线程,记录当前线程执行的行数,以便切回来的时候能继续执行);各线程之间独立存储,互不影响。
java栈: 线程私有,生命周期和线程,每个方法在执行的同时都会创建一个栈帧用于存储局部变量表,操作数栈,动态链接,方法出口等信息。方法的执行就对应着栈帧在虚拟机栈中入栈和出栈的过程;栈里面存放着各种基本数据类型和对象的引用。栈帧解释如下图。
这里写图片描述
本地方法栈: 本地方法栈保存的 是native方法的信息,当一个 JVM创建的线程调用native方法 后,JVM不再为其在虚拟机栈中 创建栈帧,JVM只是简单地动态 链接并直接调用native方法。
堆:堆数据区是用来存放对象和数组(特殊的对象)。堆内存由多个线程共享。堆内存随着JVM启动而创建。(重点关注:涉及到 内存的分配(new关键字,反射 等)与回收(回收算法,收集器 等))
方法区:也叫永久区,用于存储已经被虚拟机加载的类信息,常量,静态变 量(static变量)等数据。
运行时常量池::运行时常量池是方法区的一部分,用于存放编译期生成的各种字面量和符号引用。
本地内存:不是虚拟机运行时数据区的一部分,也不是 java虚拟机规范中定义的内 存域; 如果使用了NIO,这块区域 会被频繁使用,在java堆 内可以用directByteBuffer 对象直接引用并操作这块内存不受java堆大小限制,但受本机总内存的限制,可以通过MaxDirectMemorySize来设置(默认与堆内存最大值一样),所以也会出现 OOM异常。

3.线程共享与线程私有

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值