您的位置:首页 > 编程语言 > Java开发

Java虚拟机基础知识汇总 (二)

2018-01-29 16:28 471 查看
Java虚拟机基础知识汇总 (一)对JVM的类加载器进行了简单概述,本博客主要是关于运行时数据区的问题。

1. JVM运行时数据区

JVM在执行Java程序时都会把内存划分为几个不同的数据区域,这几个数据区域各自的作用是不同的,JVM运行时数据区的组成和结构如下图所示:



jvm运行时数据区分为堆和栈两种类型,其中堆区为线程共享区,而栈区则为线程私有区。

堆区分为堆和方法区,栈区分为jvm栈、本地方法栈和程序计数器。

下面详细介绍各个数据区的作用:

1. 堆:存储对象实例和数组。堆是垃圾回收的主要区域,可划分为新生代(Eden区、Survivor区)和老年代(Old):

Eden区:存储新对象或者生命周期很短的对象;

Survivor区:存储那些经历了Eden区垃圾回收之后仍然存活下来的仍然被引用的对象;

Old:存储那些经历了Eden区和Survivor区的垃圾回收后仍存活下来的对象;

设置:

-Xms
:设置堆的最小空间大小;

-Xmx
:设置堆的最大空间大小;

-XX:NewSize
:设置新生代最小空间大小;

-XX:MaxNewSize
:设置新生代最大空间大小;

-XX:SurvivorRate
:设置Eden和Survivor的比值

2. 方法区:存储运行时常量池、已经被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

其中运行时常量池存储编译期生成的各种字面量和符号引用。

方法区可划分为持久代(PermGen)和代码缓存:

持久代:存储类的定义和结构信息(字段、方法、接口、构造函数)以及常量在内的类相关信息;

代码缓存:存储编译器编译后的代码等数据;

设置:

-XX:PermSize
:设置持久代的最小空间大小;

-XX:MaxPermSize
:设置持久代最大空间大小;

3. jvm栈:描述的是Java方法执行的内存模型。每个方法在执行的同时都会开辟一段内存,称为“栈帧”,

用于存放方法运行时所需的数据,包括:局部变量表、操作数栈、动态链接、方法出口等信息。

其中局部变量表中存储编译期可知的各种基本数据类型和对象的引用

设置:

-Xss:
:设置每个线程的栈空间大小;

4. 本地方法栈:类似于jvm栈,jvm栈是用来执行Java方法的,而本地方法栈是用来执行Native方法的,为jvm所调用到的本地方法服务。

5. 程序计数器:是一块较小的内存空间,如果线程当前执行的是一个java方法,那么它存储的是正在执行的指令的地址,如果是native的方法,则值为Undefined。

该区域是jvm中唯一一个被授权不会出现任何内存溢出OutOfMemoryError异常的数据区。

参考连接:https://www.jianshu.com/p/83d4de172506,感谢作者~

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: