`
不平凡的人
  • 浏览: 33066 次
  • 性别: Icon_minigender_1
  • 来自: 嘉峪关
社区版块
存档分类
最新评论

JVM概述

 
阅读更多

本文从以下方面对JVM进行描述:

 

一、Java虚拟机概述与基本概念

二、堆、栈、方法区

 

一、Java虚拟机概述与基本概念

 

1、虚拟机概述

所谓的虚拟机,就是一台虚拟的机器。是一款软件,用来执行一系列的虚拟计算指令,大体可将虚拟机分为:

系统虚拟机,程序虚拟机。

 

系统虚拟机:Visual Box、VMare完全是对物理计算机的仿真,提供一个可完整运行操作系统的平台。

程序虚拟机:Java虚拟机,如:HotSpot,专门为了执行单个计算机程序而设计的,java虚拟机执行的是字节码指令。

 

一般系统虚拟机收费标准为:内核、内存、硬盘、带宽等方法进行收费。

 

2、基本概念说明

(1)类加载子系统:负责从文件系统或者网络中加载Class信息,加载后的信息放到方法区内存空间中。

(2)方法区:就是存放类信息、常量信息、常量池信息、包括字符串、数字字面量等。

(3)Java堆:在java虚拟机启动时候建立java堆,他是java程序最主要的工作内存区域,几乎所有的对象实例都放在java堆中,堆是所有线程共享的内存区域。

(4)直接内存:Java的NIO库允许java程序使用直接内存,从而提高性能,通常直接内存的速度会优于java堆。读写频繁的场合会使用。

(5)每个虚拟机的线程都有一个私有的栈,一个线程的java栈在线程创建的时候被创建,java的栈中保存在局部变量、方法参数、同时java方法的调用、返回值等。

(6)本地方法栈和java栈非常类似,最大的不同为本地方法栈用于本地方法的调用。java虚拟机允许java直接调用本地方法。

(7)垃圾收集系统是java的核心,也是必不可少的。java有一套自己的垃圾收集机制,无需开发人员手工清理。

(8)程序计数器:每个线程私有的内存空间。java虚拟机为每个线程创建一个程序计数器。

(9)虚拟机最核心的组件就是执行引擎,他负责执行虚拟机的字节码。

 

二、堆、栈、方法区

 

堆是用来解决数据的存储问题,数据怎么放、放在那儿。

栈用来解决程序的运行问题,程序如何执行,或者说如何处理数据。

方法区则是辅助堆栈的一块永久区(perm),解决堆栈信息产生的先决条件。

 

1、堆

java堆是和应用程序关系最为密切的内存空间,几乎所有的对象都放在其中,并且java堆是完全的自动化管理,通过垃圾回收机制,垃圾对象会自动清理。

 

根据垃圾回收机制的不同,java堆可能拥有不同的结构。最为常见的是将堆分为,新生代、老年代

新生代:存放新生的对象以及年龄不大的对象。

老年代:存放老对象。

 

新生代:分为eden(伊甸园)、s0和s1(也被成为from、to区,两块的大小是相同的,并且可以互换角色空间)

 

绝大对数情况,对象首先分配在eden区,在一次新生代回收之后,如果对象还存活,则会进入s0或者s1区域,之后没经过一次新生代回收,如果对象存活则他的年龄加1,当对象达到一定的年龄之后,则进入老年代(tenured区)。

 

2、java栈

java栈是一块线程私有的内存空间,一个栈一般有3部分组成:局部变量表,操作数栈,帧数据区

 

局部变量表:用于报错函数的参数及局部变量。

操作数栈:主要保存计算过程的中间结果,同时作为计算过程中变量的临时的存储空间。

帧数据区:除局部变量表和操作数栈外,栈还需要一些数据来支持常量池的解析,这里的帧数据区保存着访问常量池的指针,方便程序访问常量池。另外,当函数函数返回或者出现异常时,虚拟机必须有一个异常处理表,方便发送异常的时候找到异常代码,因此异常数据处理表也是栈数据区域的一部分。

 

3、java方法区

java方法区和堆一样,方法区为一块线程共享的数据区域。他保存着系统的类信息,不如类的字段、方法、常量池等。方法区大小决定系统可以保存多少类,如果系统定义太多的类,导致方法区溢出。虚拟机同样会抛内存溢出错误。

 

方法区可以理解为永久区(perm)。

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics