码迷,mamicode.com
首页 > 其他好文 > 详细

JVM(一) ---JVM的数据模型

时间:2019-01-21 22:54:13      阅读:176      评论:0      收藏:0      [点我收藏+]

标签:比较   nbsp   执行   werror   overflow   计数器   int   alt   min   

JVM的逻辑内存模型图
技术分享图片

[逻辑内存模型图]

-----

JVM内部分区

其实JVM内部不仅仅只有栈和堆 
包括 程序计数器 、 Java 虚拟机栈 、本地方法栈、Java 堆、方法区等

1. 程序计数器

线程私有,较小的内存空间,如果线程正在执行的是一个Java 方法,这个计数器记录的是正在执行的虚拟机字节

码指令的地址;如果正在执行的是Natvie 方法,这个计数器值则为空(Undefined)。此

内存区域是唯一一个在Java 虚拟机规范中没有规定任何OutOfMemoryError 情况的区域。

2. Java 虚拟机栈(栈区) 
线程私有,每个方法被执行的时候都会同时创建一个栈帧用于存储局部变量表、操作栈、动态

链接、方法出口等信息。每一个方法被调用直至执行完成的过程,就对应着一个栈帧在

虚拟机栈中从入栈到出栈的过程。

3.本地方法栈 
与虚拟机栈所发挥的作用是非常相似的,区别不过是虚拟机栈为虚拟机执行Java 方法(也就是字节码)服务,
而本地方法栈则是为虚拟机使用到的Native 方法服务,有的虚拟机(譬如Sun HotSpot 虚拟机)直接就把本地方法栈和虚拟机栈合二为一。
与虚拟机栈一样,本地方法栈区域也会抛出StackOverflowError 和OutOfMemoryError

4.Java 堆(堆区) 
线程共享,此内存区域的唯一目的就是创建并存放对象实例,也是GC区。分代收集算法:内存区大概分为新生代,老年代,永久代。
新生代从Eden区创建,复制到Survivor区(2个 from 和 to)。 GC分为minor GC 和 Full GC ,
minor GC: Eden满了就触发minor GC,minorGC会将Eden区仍然存活的会复制到ToSurvivor
,FromSurvivor一部分复制到老年代,一部分复制到ToSurvivor,此时原Eden和From的数据清空,from和to互换,这样的过程直到To被填满,复制到老年代。
FullGC:(1)年老代内存不足;(2)持久代内存不足;(3)统计得到的Minor GC晋升到旧生代的平均大小大于旧生代的剩余空间(4)调用System.gc()方法的时候,

5. 方法区(类级/静态) 
线程共享,存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
虽然Java 虚拟机规范把方法区描述为堆的一个逻辑部分,但是它别名叫做Non-Heap(非堆)
即“永久代”,不进行GC,只是针对常量池的回收和对类型的卸载 
运行时常量池:是方法区的一部分,Class常量池存放编译期生成的各种字面量和符号引用,
运行时常量池相对于Class 文件常量池的另外一个重要特征是具备动态性,运行期间也可能将新的常量放入池中,这种特性被开发
人员利用得比较多的便是String 类的intern() 方法(这个方法会首先检查字符串池中是否有”ab”这个字符串,如果存在则返回这个字符串的引用,
否则就将这个字符串添加到字符串常量池中,然会返回这个字符串的引用,这可以实现字符串的"= ="比较。new String 不进入常量池,直接赋值会进入常量池)。

JVM(一) ---JVM的数据模型

标签:比较   nbsp   执行   werror   overflow   计数器   int   alt   min   

原文地址:https://www.cnblogs.com/liumz0323/p/10301332.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!