jvm虚拟机内部原理之概述和内存分配

Java 发表评论


1.概述

JDK:java程序设计语言,java虚拟机,java API类库为API为JDK,是支持java程序开发的最小环境

JRE:java API类库的java SE子集和java虚拟机是JRE,是支持程序运行的标准环境
这里写图片描述
JDK 1.7 的主要改进:新的G1收集器,加强对非java语言的支持,升级类加载器的架构
JDK 1.8 完成1.7未能发布的特性:Lambda表达式(函数式编程),Coin项目(语言细节进化)

2.java虚拟机的内存管理

2.1 概述
java程序员把内存控制的权力交给了java虚拟机,一旦出现内存泄漏和溢出的问题,如果不了解虚拟机怎样使用内存,就很难排查错误。

2.2运行时数据区域

java虚拟机会把它所管理的内存划分为几个不同的区域。

这里写图片描述

方法区和堆是线程共享的,程序计数器,虚拟机栈和本地方法栈是独立的线程。

2.2.1 线程计数器:是一块较小的内存空间,它可以看作当前线程所执行的字节码的行号指示器。 在java虚拟机执行多线程时,多个线程之间轮流切换并分配执行时间。每个线程都有个线程寄存器,用来保存已经执行到的字节码指令。当然,计数器记录的是虚拟机字节码指令的地址。

2.2.2java虚拟机栈:执行方法的同时用虚拟机栈保存 局部变量表,操作数栈,动态链接,方法出口
我们常常说的java内存中的栈和堆是一个大致的说法,这里的栈主要指java虚拟机栈中的局部变量表,主要存放了8种基本类型,对象的引用和returnAddress类型(指向一条字节码指令的地址)

2.2.3 本地方法栈:和java虚拟机栈相似,虚拟机栈为java方法(也就是字节码)服务,但是本地方法栈为native方法服务。有些虚拟机把这两个栈合并了。

2.2.4 java堆:java堆是虚拟机管理的内存最大的一块,存放了几乎所有的对象实例。
java堆是垃圾搜集器管理的主要区域。根据垃圾收集器的分代收集算法,java堆可以分为新生代和老生代:还有更细的方法,不同的角度有不同的分割区域。

2.2.5 方法区:用于存放虚拟机加载的类信息,常量,静态常量,即时编译器编译的代码数据。也成“非堆”,“永生代”

2.2.6 运行时常量池:方法区的一部分。Class文件的常量池,永不存放编译期生成的字面量和符号引用,当这部分内容将在类加载后进入方法区的运行时常量池。

上一篇:

发表评论

邮箱地址不会被公开。 必填项已用*标注

昵称 *