网站建设综合实训ppt,商城网站建设平台,优化师简历,网站数据库分离怎么做文章声明#xff1a;文章图片均来自互联网#xff0c;因为本人画的图不够生动。
运行数据区是JVM最重要的一个区域。
运行数据区由栈、堆、元空间构成。
栈#xff1a;程序计数器、JVM虚拟机栈#xff0c;本地方法栈
本地方法栈#xff1a;加载native修饰的方法#… 文章声明文章图片均来自互联网因为本人画的图不够生动。
运行数据区是JVM最重要的一个区域。
运行数据区由栈、堆、元空间构成。
栈程序计数器、JVM虚拟机栈本地方法栈
本地方法栈加载native修饰的方法native修饰的方法都不是java原生的方法比如C
程序计数器一个指针记录正在执行的JVM指令的地址。
代码运行执行命令。而每个命令都是有行号的会使用程序计数器来记录命令执行到多少行了
虚拟机栈
虚拟机栈的组成局部变量表、操作数栈、动态连接、方法出口、栈帧
局部变量表
存放基本数据类型、引用数据类型在堆中的地址值、方法返回的地址
操作数栈
JVM在计算过程中的临时存储空间
动态连接
一个指向运行时常量池中该栈帧所属方法的引用
方法出口
记录方法结束后继续运行下一个栈帧对应方法那行代码
栈帧
栈的最小单位用来表达方法与方法之间的调用关系
所以什么是虚拟机栈
每个线程运行时所需要的内存成为虚拟机栈先进后出每个栈由多个栈帧组成对应这每次方法调用时所占的内存每个栈帧只能有一个活动栈帧对应着当前正在执行的那个方法 栈内存的释放方式垃圾回收是否涉及栈内存
垃圾回收主要指就是堆内存当栈帧弹栈以后内存就会释放
栈内存溢出情况
递归调用 栈帧过大导致栈内存溢出
堆线程共享的区域
主要用来保存对象实例数组等当堆中没有内存空间可分配给实例也无法再扩展时OutOfMemoryError异常内存溢出 Young 年轻区代: EdenS0S1, S0 和 S1 大小相等, 新创建的对象都在年轻代,主要存放朝生夕灭的对象。被小范围但高频的mini gc回收
Tenured 年老区: 经过年轻代多次垃圾回收存活下来的对象存放在年老代中。
在JDK1.8之前堆中还存在一个永久代的东西、现在以及被元空间所替代。
那么为什么JDK1.8以后取消了永久代
永久代存储的都是类信息、静态变量、常量、编译后的代码所以在堆中内存不可控的会随着项目扩大而扩大容易出现内存溢出的情况
所以、堆栈的区别是什么
栈内存一般用来存储局部变量和方法调用但堆内存是用来存储java对象和数组的。堆会GC垃圾回收而栈不会栈内存是线程私有的而堆内存是线程共有的两者异常错误不同但如果栈内存或者堆内存不足都会抛出异常。 栈空间不足java.lang.StackOverFlowError。堆空间不足java.lang.OutOfMemoryError。
方法区
方法区是各个线程共享的内存区域主要存储类的信息、运行时常量池虚拟机启动的时候创建关闭虚拟机时释放如果方法区域中的内存无法满足分配请求则会抛出OOM
元空间实现了方法区
元空间元数据区存储.class信息类的信息方法的定义静态变量等。而常量池放到堆里存储,JDK1.8和JDK1.7的区别在1.8中是由元空间取代了方法区的实现永久代
元空间与永久代的区别
永久代属于JVM堆的一部分、有固定大小性能更差元空间属于本地内存、能动态扩容、性能更好