首页 > 系统相关 >java虚拟机内存结构——类加载器,运行时数据区,执行引擎,本地方法接口。《深入理解JAVA虚拟机第三版》

java虚拟机内存结构——类加载器,运行时数据区,执行引擎,本地方法接口。《深入理解JAVA虚拟机第三版》

时间:2024-05-08 10:45:59浏览次数:24  
标签:JAVA OOM 虚拟机 Java 线程 内存 java 加载

##类加载器
    类加载器当Java程序需要使用某个类时,类加载子系统负责找到对应的.class文件,并将其加载到JVM的方法区中
    每一个类加载器,都拥有一个独立的类名称空间。只有在这两个类是由同一个类加载器加载的前提下才有意义


##运行时数据区
    ###线程共享
        ####堆:内存中的最大的一块存储区域,堆内存被所有线程共享,存放实例和数组  (OOM) (垃圾回收)
            新生代
            老年代
            1.7永久代 (1.7之后字符串常量池)
            所有线程共享的Java堆中可以划分出多个线程私有的分配缓冲区(TLAB),提高效率

        ####方法区:存class类的一些类元信息,方法区存放,常量,静态变量, 加载类信息,字符串常量池   (垃圾回收)
            1.8之前永久代 (OOM 在堆里面) (类信息)
            1.8之后本地内存元空间:堆外内存
                元空间用于存储类的元数据。元空间溢出通常是由于加载了太多类或者类的元数据过大。



    ###线程私有
        ####虚拟机栈:存放基本数据类型和局部变量和对象的引用(对象在堆),为java方法服务 (一般报栈溢出。拓展栈空间失败OOM)
            new出来的对象如果经过逃逸分析发现永远只存在某个方法,如果是就new在栈里,减少垃圾分配的压力。
            每个方法被执行的时候,Java虚拟机都会同步创建一个栈帧用于存储局部变量表、操作数栈、动态连接、方法出口等信息。每一个方法被调用直至执行完毕的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程
            如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常;如果Java虚拟机栈容量可以动态扩展,当栈扩展时无法申请到足够的内存会抛出OutOfMemoryError异常。
            进入一个方法时,这个方法需要在栈帧中分配多大的局部变量空间是完全确定的,在方法运行期间不会改变局部变量表的大小
            #####局部变量表:各种Java虚拟机基本数据类型、对象引用、returnAddress类型


        ####本地方法栈:为native方法服务(拓展栈空间失败OOM)。
        ####程序计数器(除了程序计数器不会发生OOM):没有规定任何OOM情况的区域。  Java虚拟机的多线程是通过线程轮流切换、分配处理器执行时间的方式来实现的,在任何一

个确定的时刻,一个处理器(对于多核处理器来说是一个内核)都只会执行一条线程中的指令。为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器。如果线程正在执行的是一个Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;如果正在执行的是本地(Native)方法,这个计数器值则应为空

    ####直接内存(OOM) (垃圾回收)
        直接向系统申请的内存空间,访问速度通常优于Java堆
            **应用内存增加**,但是元空间内存和堆内存没有增加的唯一解释
            不收jvm垃圾回收的管理,会出现OOM。



##执行引擎:jit及时编译器,解释器,gc收集器
##本地方法接口

标签:JAVA,OOM,虚拟机,Java,线程,内存,java,加载
From: https://www.cnblogs.com/liang302/p/18179185

相关文章

  • JavaScript中指定大小分割数组的一种实现
    今天分享一个使用JavaScript分割数组为多个自数组的方法实现。我使用它的场景如下:给定一个数组arr和指定大小fixed:constarr=[ { id:1, name:'name1' }, { id:2, name:'name2' }, { id:3, name:'name3' }, { id:4, name:'name4' }, { ......
  • java的三种编译(JAVAC,JIT,AOT)
    1.javac把java代码编译成字节码(中间代码),然后由java虚拟机解释执行2.jit(运行时编译)把java代码直接编译成机器码,然后由java虚拟机直接运行(缓存)。有对客户端的C1和对服务器端的C2编译器缓存代码优化逃逸分析,是否超出范围。对不同逃逸状态做优化全局逃逸对象超出了方法或线......
  • 「Java开发指南」如何用MyEclipse搭建GWT 2.1和Spring?(一)
    本教程将指导您如何生成一个可运行的GoogleWebToolkit(GWT)2.1和Spring应用程序,该应用程序为域模型实现了CRUD应用程序模式。在本教程中,您将学习如何:安装GoogleEclipse插件为GWT配置一个项目搭建从数据库表到一个现有的项目GWT编译部署应用程序注意:自定义Spring代码......
  • java异常报警
    `@Component@Aspect@Slf4jpublicclassServiceExceptionHandler{@ResourceExceptionWarnSendsend;//Service层切点@Pointcut("@annotation(mrh.com.modules.app.annotation.ServiceJobExcepCatch)")publicvoidserviceAspect(){}//全局异常注解@Around(&......
  • IDEA多版本Java
    过程到官网下载不同版本的JDK解压到指定的路径在IDEA中添加其他版本的JDK,使用时只需要进行切换就可以。JDK下载JDK下载地址:http://jdk.java.net/JDK8下载地址:https://www.oracle.com/java/technologies/downloads/archive/先将java安装到指定的文件路径F:\JavaEnviron......
  • [JS] idea中javascript显示无背景色,不能点击大括号收起代码
    idea idea安装组件File->Settings->pluginsmarketplace搜索安装javascriptandtypescript插件(如果marketplace搜素搜索不到,搜索下installed里是否已经安装过了;如果已经安装过了且勾选框是选中的,去勾选插件,保存。然后重新再勾选上,保存) 效果如下: ......
  • 解决远程调用三方接口:javax.net.ssl.SSLHandshakeException:sun.security.validator.Va
    一、前言最近在对接腾讯会议API接口,在鉴权完成后开始调用对方的接口,在此过程中出现调用报错:javax.net.ssl.SSLHandshakeException。二、出现原因当你在进行https请求时,JDK中不存在三方服务的信任证书,导致出现错误javax.net.ssl.SSLHandshakeException:sun.security.validator.Va......
  • java 两个列表的元素是否相等且各自元素数量相等
    示例如下:importjava.util.*;publicclassMain{publicstaticvoidmain(String[]args){List<String>list1=Arrays.asList("深圳攀峰运","深圳攀峰运","广州博纳德","广州博纳德","广州博纳德","广州博纳德");......
  • java容器化项目改造
    dockerjava项目容器化改造前后端分离项目前端https://gitee.com/yuco/eladmin-web.git后端https://gitee.com/yuco/eladmin.git要素:vuenpmspringbootmysqlredisjava后端容器化思路:了解在物理机虚拟机的部署流程,然后编写dockerfile进行容器化部署。java项目,使用mv......
  • Java测试框架Junit5基础知识点
    Junit5测试框架一:创建一个测试用例junit5的测试依赖:<!--junit5新的编程和扩展模型--><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter</artifactId><version>5.8......