【JVM整体结构和内存模型】

【JVM整体结构和内存模型】,第1张

【JVM整体结构和内存模型】 JVM整体结构和内存模型 1.jvm虚拟机分为三大块:类装载子系统 字节码执行引擎 运行时数据区 2.运行时数据区分为:本地方法栈 栈 堆 方法区(元空间) 程序计数器

1.程序计数器:当前线程执行的java字节码的行号指示器,为了线程能够恢复到正确的位置。每条线程都有一个独立的程序计数器,如果正在执行的是native方法,这个计数器的值则是空。此区域没有规定OOM的情况。
2.java虚拟机栈:也是线程私有的,他的生命周期和线程相同,描述的java方法执行的内存模型,每一个方法在执行的时候都会创建一个栈帧放在自己所属的虚拟机栈中;每一个栈帧doubaohanyou都包含有局部变量表, *** 作数栈,动态链接,方法出口;
局部变量表:存放了编译期可知的各种基本数据类型和对象的引用、返回地址类型。其中64位的类型占有两个slot、其余的都是占用1个slot,局部变量表的内存空间在编译期间完成分配,当进入一个方法时,在栈帧中分配多大的局部变量表是定好的。如果大于虚拟机所允许的最大深度,报出 StackOverflowError异常;如果虚拟机栈可以动态扩展,扩展时无法申请足够的内存,报OOM异常。

3.本地方法栈:本地方法栈是为虚拟机使用到native方法服务的,也会抛出 StackOverflowError 和 OOM 异常。
-xss 设置每个线程栈的大小 默认1M
在相同物理内存下减少这个值可以生成更多的线程,但是 *** 作系统对一个进程中的线程数还是有一定的限制 3000左右
4.java堆:JAVA堆是被所有线程共享的一块区域,jvm启动时创建,唯一目的就是存放对象的实例,但不是所有的对象都会放在堆中,有一些方法体内的对象是可以存放在栈中的,方法结束对象也就消失了。
java堆也是垃圾收集器主要 *** 作的区域。
-Xms 设置堆的最小空间大小
-Xmx 设置堆的最大空间大小
-Xmn 设置新生代大小
在开发过程中,通常会将-Xms和-Xmx配置相同的值,其目的是为了能够在java垃圾收集器清理完堆后,不需要重新分隔计算堆区的大小而浪费资源
5.方法区(永久代):它存储已被虚拟机加载的类信息、常量、静态变量等数据,就是存放静态文件。也有人把方法区称之为永久代。这部分区域,一般垃圾收集过程很少会回收到垃圾,当方法区分配不足的时候,抛出 OOM异常。
运行时常量池也在方法区中,方法区中有一部分是常量池存放编译期的各种字面量和符号引用,这部分内容将在类加载后进入运行时常量池

6.直接内存,nio的buffer缓存 也会出现OOM异常

类装载子系统 功能:把类加载到内存的过程 字节码执行引擎:说白了就是class文件中的code部分需要交给字节码执行引擎来处理,还会修改程序计数器

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5678262.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存