java 内存管理_第1页
java 内存管理_第2页
java 内存管理_第3页
java 内存管理_第4页
java 内存管理_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Java 内存的分配Jvm 体系结构:1、类装载系统、负责把类从文件装入内存。2、GC 系统、回收不再运行程序中的实例化对象所占的内存 和 正在使用的对象、用来减少堆碎片。3、内存区:用于存储字节码、程序运行时创建的对象、传给方法的参数,方法的返回值,局部变量和中间计算的结果。4、执行引擎:4.1、解释字节码文件、一次性解释字节码。4.2、快,但消耗内存:“即时编译器“,第一次执行的字节码会被编译成机器代码。4.3、自适应的优化器:jvm 在开始时会解释字节码,随后在运行中会监视程序的活动,并记录使用频繁的代码段。程序运行的时候,虚拟机会把使用最多的字节码编译成本地代码,其他的还是字节码jvm

2、 继续在需要的时候解析他们。4.4、由硬件芯片组成,使用本地方法执行.java 字节码,这种执行引擎是内嵌在芯片里的。2:Java 的内存分配:在Java 程序运行中,jvm 定义了各种区域 用于存放运行时的数据。其中有些存储区域是在jvm 启动时创建,在jvm 退出时销毁。其他的数据区域与每个线程有关。这些存储区域在线程创建时创建,在线程退出时销毁。(内存区2.1、程序计数器 寄存器Jvm 支持多个线程同时运行 并且都有自己的程序计数器。在任何程序的一点、每个jvm 的线程执行单个方法的代码,这个方法是线程的当前方法。如果方法不是 native 的。程序计数器包含了当前执行的jvm 的地址,

3、如果方法是native 的,程序计数器的值就不会被定义。2.2、栈。2.1、栈与线程Jvm 是基于栈的虚拟机,jvm 为每个新建的线程都新建一个栈。就是说 Java 程序的运行就是通过对栈的操作完成的,栈以帧的单位保存线程的状态。Jvm 对栈只有2种操作:用帧为基本单位进行的压栈和出栈。我们知道当前线程正在执行的方法叫做此线程的当前方法,而当前线程会关联一个栈,而栈的基本单位是帧,以此来说 当前的方法会使用一个帧 这个帧就叫做当前帧。当线程激活一个Java 方法时jvm 就会在当前线程中的栈中新压入一个帧。这个帧自然成为了当前帧,在此方法的执行期间,这个帧就保存参数,局部变量,中间计算过程的值

4、和其他数据(类似jvm 体系中的内存区 。(注:一个程序可以做很多事情,一个事情就是一个线程:一个事情就是 一个方法里面可以包含N 个方法 程序中的login 就是例子 虽然只在 action 中调用 serviceImpl 中的login 但是serviceImpl 又会调用 daoImpl 中的方法 这就是一个事情。从这种分配机制中,栈(Stack是操作系统在建立冒个线程时为这个线程提供的存储区域,该区域有先进后出的特点。如下图所示:(嵌套式方法 这是 MVC 模式下的 登录业务,就是 一个事情。以上图为例: 方法开始时 会有一个帧出现、随后栈中会存入一个loginaction 而logi

5、naction 调用了 userviceImpl 中的方法就会再存入一个 userviceImpl ··· 到最后 调用 JDBC 到 abstaticDao 中完成 executeQuery 然后就开始 释放内存 从 jdbc abstaticDao DaoImpl UserviceImpl loginaction 。(如果嵌套的方法很多 就会有内存的堆积 线程就容易死掉当然 如果不是 嵌套的方法 就不会有内存的 堆积。2.3、堆每一个Java 引用里面都有一个对应的jvm 实例,每一个实例唯一对应一个堆。应用程序所创建的所有 实例 和 数组 都会放在这个堆中并

6、由所有线程共享,Java 中分配内存是自动初始化的。Java 中所有对象的存储空间都是在堆中分配的,但是 对象的 引用是在栈中分配的,就是说 Java 中建立一个对象会从2个地方分配内存,在堆中分配对象的实际创建内存,在栈中则获得这个对象的引用。(c中的指针2.4、堆和栈的区别。2.4.1、栈(Stack 和 堆(heap 都是 Java 用来在 随机内存 中存放数据的地方,Java 自动管理堆和栈,程序员不能直接操作栈和堆。2.4.2、栈的存取速度比堆快,仅此与cpu 中的寄存器。但缺点是,存在栈中的数据的大小和存在时间必须是确定的。可以共享,而堆的优势是可以动态的分配内存大小,生存期也由G

7、C 自动回收,2.4.3、Java 中的数据类型。1、基本数据类型 int,short,long,byte,float,double,boolean,char. 这种类型定义是 int a=3; 称为自动变量,是没有类参与的。既不是类的引用也不是实例 a 是一个指向 int 类型的引用,指向 3 这个字面值。这个 a 是存在 栈 中的 (大小可知,生存期可知 。因为栈中的数据时可以共享的。假设 定义:Int a=3; int b=3;编译器先处理 int a=3; 首先他会在栈中创建一个变量a 的引用,然后查找有没有字面值为3的地址,如果没有就会创建一个值为 3 的地址。接着处理 int b=

8、3; 在创建 b 的变量时 已经存在值为 3 的地址,那么 b 就直接指向3的地址,这样,就出现了 a,b 同时指向3的情况。如果修改其中的一个值,就会在栈中新开辟一个地址。2、包装类型的数据 如 integer String Double 等将基本数据类型包装起来的类。这些类数据全部存在堆中,Java 应用用 New( 语句来显示的告诉编译器,在运行时才根据需要动态创建。2.4 String 是特殊的包装类型。2.4.1、可以用 String str=new String(“abc”; 来创建,也可以用String str=”abc” 来创建 String str=”abc”;隐藏了创建的过

9、程。首先在栈中创建一个 abc 的值的地址,在堆中创建一个对象(test,此对象并不是str, 而是str 指向了此对象,使 堆 中的对象指向 栈中的数据, 没有用NEW 时 数据时可以共享的2.4.2、要说明的是 String str=new String(“abc”;和 String str1=”abc”;虽然在栈中的值一样,但是 New 出来的对象有自己独有的栈空间。是不可共享数据的。2.4.3、包装类型的数据的值是不可修改的。2.4.4、2 使用String str = "abc";的方式,可以在一定程度上提高程序的运行速度,因为JVM 会自动根据栈中数据的实际情况来决定是否有必要创建新对象。而对于String str = new String("abc";的代码,则一概在堆中创建新对象,而不管其字符串值是否相等,是否有必要创建新对象,从而加重了程序的负担。这个思想应该是享元模式的思想,但JDK 的内部在这

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论