一、实验目的(1)了解Windows内存管理机制.理解页式存储。(2)了解Java下内存管理的基本数据结构。(3)掌握Java内存管理相关类和接口的使用。二、实验准备知识:相关数据结构以及类和接口1. Java内存查看命令Java通过jvm管理内存,同时Java提供了一些命令行工具,用于查看内存使用情况。(1)jstat查看gc实时执行情况。jstat命令格式:jstat [Options] vmid [ interval] [ count ]命令参数说明:Options:一般使用-gcutil或-gc查看gc情况。pid:当前运行的Java进程号。interval:间隔时间,单位为秒或毫秒。count:打印次数,如果缺省则打印无数次。Options参数如下:-gc:统计jdk gc时heap 信息,以使用空间字节数表示。-gcutil:统计gc时heap情况,以使用空间的百分比表示。-class:统计calss loader行为信息。-compile:统计编译行为信息。-gccapacity:统计不同generations(新生代.老年代:持久代)的heap容量情况,-gccause:统计引起gc的事件。-gcnew:统计gc时新生代的情况。-genewcapacity:统计gc时新生代heap容量.-gcold:统计gc时老年代的情况。gcoldepaety统计gc时老年代heap容量。gcpermcapacity: 统计gc时permanent区heap容量。示例:$ jstat -gc 12538 5000(2) jmap查看各个代的内存使用。jmap可以从core文件或进程中获得内存的具体匹配情况,包括Heap size、Pem size等。jmap命令格式:jmap[ option ] i < executable core> I <[server - id@ ]remote - hostname- or - IP>命令参数说明:pid: java 进程ID。executable:产生core dump的Java可执行程序。core: core dump文件。remote -hostname-or-IP:远程debug服务的主机名或IP。server-id:远程debug服务的ID。option参数:- heap打印heap的概要信息,gc使用的算法,heap的配置及使用情况。- histo[ :live]打印jvm heap的直方图。输出类名、每个类的实例数目、对象占用大小VM的内部类名称开头会加上前缀“*”。如果加上live 则只统计活动的对象数量。- dump:[live, ]format= b, file=使用hprof二进制形式,导出heap内容到文件filename。假如指定live选项,那么只输出活动的对象到文件。一finalizer info打印正等候回收的对象的消息。permstat打印classload和jvm heap持久代的信息。包含每个classloader的名名称.是否活跃地址、父classloader、加载的class 数量、内部String的数量和占用内存数。-F当pid没有响应的时候,与-dump或-histo共同使用,强制生成dump文件或histo信息。在这个模式下.live子参数无效。-J传递参数给启动jmap的jvm.(3)使用Java类库。空闲内存:Runtime getRuntime(). freeMemory()总内存:Runtime. getRuntime(). totalMemory()最大内存:Runtime. getRunt ine( ). maxMemory()已占用的内存:Runtime. getRuntime().totalMemory() - Runtime. getRuntime(). freeMemory()2. Java内存分配函数与接口Java不能直接访问操作系统底层,而是通过本地方法来访问。Unsafe类提供了硬件级别的原子操作,类中提供的3个本地方法(allocateMemory. reallcaeaoryMemory、freeMemory)分别用于分配内存、扩充内存和释放内存,与C语言中的3个方法相对应。long Unsafe. allocateMemory(long size)-分配一 块内存空间。 这块内存可能会包含垃圾数据(没有自动清零)。如果分配失败会抛一个java. lang. OutOfMemoryError的异常。它会返回一个非零的内存地址(看下面的描述)。Unsafe. reallocateMemory(long address, long size)--重 新分配一块内存,把数据从旧的内存缓冲区(address指向的地方)中复制到新分配的内存块中。如果地址等于0,这个方法和allcateMemory的效果是一样的。 它返回的是新的内存缓冲区的地址。Unsafe. freeMemory(long adress)--- 释放一个由前两个方法 生成的内存缓冲区。如果address为0则不释放。以上方法分配的内存应该在一个被称为单寄存器地址的模式下使用: Unsafe提供了一组只接受一个地址参数的方法(不像双寄存器模式,它们需要一个Object还有一个偏移量offset)通过这种方式分配的内存可以比在-Xmx的Java参数中配置的还要大。注意: Unsate分配出来的内存是无法进行拉极回收的,要把它当成一种正常的资源去管理。用法举例:import java.lang.reflect.Field;Import java. util. Arraysinport sun. misc. Unsafe;final int size =Integer, MAX VAUEB/2; //分配内存,大小为sizefinal long addr = unsafe. allocateMemory( size );trySystem. Out.println( "Unsafe address=”+addr);for( int i=0;i<size;++i){unsfte putByte( addr+i, (byte) 123);if( unafe. getByte( adr+i)!=123 )Sysetm. out println( "Failed at offset="+ i);}}finally{unsafe. freeMemory( addr );//释放内存}三 实验内容在Java环境下,使用函数和相关命令显示系统内存使用情况,为进程分配内存。
先整好文字排版,突出问题内容