模拟面试回答第十三问:JVM内存模型
JVM简介JVM是Java程序运行的基石包括程序计数器两种栈堆和方法区五个区域。包含保存类元数据保存方法字节码执行顺序保存符号引用与直接地址的映射为对象实例分配内存为堆中内存分配对象引用指向下一条要执行的字节码等等这都是JVM做的事。内部区域划分JVM的内部区域可按线程私有和线程共享划分首先线程私有包括程序计数器和栈线程私有就是说与线程的生命周期一致随线程生和灭每个线程都有各自的程序计数器和栈。其次线程共享包括堆和方法区线程共享就是说与JVM、与进程的生命周期一致随进程生和灭所有线程共同使用堆和方法区。内部区域详解程序计数器先说线程私有的部分首先是程序计数器。程序计数器是字节码指令顺序指针保存下一条要执行的指令执行顺序通过方法区Klass中的Method对象获取这个程序计数器是五个区域中唯一的不会爆发OOM的区域。栈栈分Java方法栈和本地方法栈分别为Java方法和Native方法服务Native方法就是C/C语言写的。栈会在执行方法前为方法创建栈帧栈帧中保存局部变量、操作数和Klass指针等等。这个区域是可能爆发栈溢出的进而爆发OOM如果递归没写好终止条件会导致无限堆栈就会发生栈溢出和OOM。堆堆是JVM为对象实例分配内存的地方保存对象的实际值根据方法区的Klass明确分配多少内存。这里我重点关注了对象头区域。对象头包含了很多字段包括哈希值GC年龄GC颜色锁标志以及Klass指针。比如instanceof关键字判断对象所属类就可以通过Klass指针判断还有hashCode计算出的哈希值保存在对象头中供哈希集合使用发生GC时的对象头会被填充进GC年龄和GC颜色及其他信息来更好的GC原信息要被暂时保存在GC线程中还有保存锁的状态进行锁升级等等。堆是为对象实例分配内存的地方那堆内存是有限的一旦对象分配过多导致堆内存不够了怎么办对象什么时候被删除一个对象用完了之后怎么办它分配的那块内存要收回吗这就与JVM的垃圾回收机制有关简称GCGC能回收一些用完被判定为垃圾的对象尽力防止对象填满堆的情况所以堆是GC主要的工作区域堆又被称为GC堆这个区域是可能爆发OOM的。方法区方法区是JVM存储类元数据的地方我们写的.class二进制字节码文件进入JVM方法区后被组织成JVM运行时数据结构Klass方法区以Klass为单位存储类元数据Klass内部是有划分的包括类的字段信息类的继承信息Method对象保存方法信息常量池保存方法中符号引用与直接地址的映射比如new User()这行代码被放在Method对象中对于User这个符号JVM需要得到这个类的Klass地址完成符号引用转直接引用才能生效为User分配内存。各个区域中都有保存各自的指针通过指针访问。这是方法区的大致构造那方法区曾经不是独立的一块区域而是在堆中这样的实现方式叫做永久代用永久代实现的方法区使用堆的内存那堆内存是比较有限的分配给方法区的就更有限了容易加载的类过多爆发OOM那在JDK8之后方法区独立出来由元空间实现使用本地内存本地内存非常大不容易爆发OOM。简单总结一下类元数据放在方法区中对象实例放在堆中通过方法区Klass明确分配多大内存对象实例的地址在栈中被引用程序计数器指向下一行要执行的指令。除此之外还有执行引擎负责编译执行Java程序但执行引擎不属于JVM内存模型。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2457633.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!