Java内存管理——内存分配

来源:互联网 发布:手机淘宝分类在哪 编辑:程序博客网 时间:2024/05/16 19:10

Java中,它的内存管理包括两方面:内存分配(创建Java对象的时候)和内存回收,这两方面工作都是由JVM自动完成的。本文介绍Java内存分配,下回介绍内存回收。


Java虚拟机:

Java虚拟机是整个 Java平台的基石,是让Java语言能够实现和硬件无关、操作系统无关的关键部分,是 Java语言生成出极小体积的编译代码的运行平台,是保障用户机器免于恶意代码损害的保护屏障。

Java虚拟机可以看作是一台抽象的计算机。如同真实的计算机那样,它有自己的指令集以及各种运行时内存区域。使用虚拟机来实现一门程序设计语言有许多合理的理由,业界中流传最为久远的虚拟机可能是 UCSD Pascal的 P-Code虚拟机。

Java虚拟机与 Java语言并没有必然的联系,它只与特定的二进制文件格式——Class文件格式所关联,Class文件中包含了 Java虚拟机指令集(或者称为字节码、Bytecodes)和符号表,还有一些其他辅助信息。

基于安全方面的考虑,Java虚拟机要求在 Class文件中使用了许多强制性的语法和结构化约束,但任一门功能性语言都可以表示为一个能被 Java虚拟机接收的有效的 Class文件。作为一个通用的、机器无关的执行平台,任何其他语言的实现者都可以将 Java虚拟机作为他们语言的产品交付媒介。


Java内存分配:

Java内存区域分为6块:


 

(1)Java堆:

new方式创建的对象,分配到堆内存中。

堆内存又分为:新生代(Young)、老年代(Old)、永久代(Permanent)。

新生代又分为1个Eden区和2个Survivor区(From和To)。Eden空间不足的时候,会把存活的对象转移到Survivor中,新生代大小可以由-Xmn来控制,也可以用-XX:SurvivorRatio来控制Eden和Survivor的比例。

在 Java虚拟机中,堆(Heap)是可供各条线程共享的运行时内存区域,也是供所有类实例和数组对象分配内存的区域。Java堆在虚拟机启动的时候就被创建,它存储了被自动内存管理系统(Automatic Storage Management System,也即是常说的“GarbageCollector(垃圾收集器)”)所管理的各种对象,这些受管理的对象无需,也无法显式地被销毁。


(2)方法区:

存放了要加载的类信息、static变量、final常量、属性和方法信息。

JVM用永久代(PermanentGeneration)来存放方法区,可通过-XX:PermSize和-XX:MaxPermSize来指定最小值和最大值。

方法区在虚拟机启动的时候被创建,虽然方法区是堆的逻辑组成部分,但是简单的虚拟机实现可以选择在这个区域不实现垃圾收集。它存储了每一个类的结构信息,例如运行时常量池(Runtime Constant Pool)、字段和方法数据、构造函数和普通方法的字节码内容、还包括一些在类、实例、接口初始化时用到的特殊方法。

 

(3)运行时常量池:

用于存储类或接口中的常量。位于方法区。

每一个运行时常量池都分配在Java虚拟机的方法区之中,在类和接口被加载到虚拟机后,对应的运行时常量池就被创建出来。

 

(4)Java虚拟机栈:

每一条 Java虚拟机线程都有自己私有的 Java虚拟机栈(Java Virtual Machine Stack),这个栈与线程同时创建,用于存储栈帧(StackFrame)。Java虚拟机栈的作用与传统语言(例如 C语言)中的栈非常类似,就是用于存储局部变量与一些过程结果的地方

每个线程执行每个方法的时候都会在栈中申请一个栈帧,每个栈帧包括局部变量区和操作数栈,用于存放此次方法调用过程中的临时变量、参数和中间结果。当方法被调用时,栈帧在JVM栈中入栈,当方法执行完成时,栈帧出栈。

 

(5)本地方法栈:

用于支持native方法的执行,存储了每个native方法调用的状态。


(6)PC寄存器

PC(ProgramCounter程序计数器)

任意时刻,一个线程只会执行一个方法的代码,这个方法称为当前方法(Current Method)。如果该方法不是Native的,PC寄存器就保存JVM正在执行的字节码命令的地址。可以理解为当前线程所执行的字节码执行到了第几行,即当前线程的行号指示器。字节码解释器在工作时,会通过改变这个计数器的值来取下一条语句指令。

每个程序计数器只用来记录一个线程的行号,所以它是线程私有(一个线程就有一个程序计数器)的。

如果该方法是Native的,那PC寄存器的值是Undefined。


参考:

《Java虚拟机规范(Java SE 7版)》

http://www.importnew.com/15671.html

http://www.cnblogs.com/zhguang/p/3257367.html#distribution

0 0
原创粉丝点击