189 8069 5689

写出Java代码内存图解 java写一段代码内存溢出

eclipse怎么画内存图示

前言

10余年的湘潭县网站建设经验,针对设计、前端、开发、售后、文案、推广等六对一服务,响应快,48小时及时工作处理。成都全网营销推广的优势是能够根据用户设备显示端的尺寸不同,自动调整湘潭县建站的显示方式,使网站能够适用不同显示终端,在浏览器中调整网站的宽度,无论在任何一种浏览器上浏览网站,都能展现优雅布局与设计,从而大程度地提升浏览体验。创新互联建站从事“湘潭县网站设计”,“湘潭县网站推广”以来,每个客户项目都认真落实执行。

内存视图是由Eclipse调试框架提供,用来检查程序内存的。它是一个灵活的视图,允许调试扩展者自定义内存监视器的展示方式来满足他们的用户需求。你可以使用SWT的控件来展示内存监视器。

内存视图在开发之初,一个目标就是支持不同人的不同需求和模型。它需要能够支持从在大型机上工作的开发人员到小型嵌入式设备上的开发者的需求。这么大范围的群体的需求千差万别。当在一个平台上使用某种特定的、可能对用户有意义的内存展示方式来表示内存时,在另一个平台可能对用户来说完全是混乱不堪的。

上面的问题的解决办法就是,提供一个视图和一个框架,允许调试扩展者来定义自己的内存监视器展示方式。这篇文章就要讨论这个框架,演示如何在调试器中添加内存视图支持。

图1 内存视图

图1是内存视图,它由三窗格组成。左边的窗格叫做监视器(Monitors)窗格,列出了被当前调试会话监视的所有的内存监视器。右边的两个窗格叫做渲染结果(Renderings)窗格。它们显示的是从第一个监视窗格中选中的内存监视器的监视结果。一个内存渲染器就是一个内存监视器的用户展示,它使用一种展示的格式来展示内存监视的内容。在图1中,内存视图显示了内存监视器“str”的两个渲染效果。十六进制渲染使用传统的表格格式显示,十六进制树渲染使用树的格式显示。

做为一个调试扩展者,可以通过两种方法来扩展内存视图:

重用调试平台提供的内存渲染器

调试平台提供了可重用的四个表格渲染器集合:十六进制、ASCII、有符号整形和无符号整形。你可以在你的调试器中很简单地添加内存监视器,重用这些渲染器。这些渲染器支持自定制。图1中十六进制渲染器就是调试平台提供的一个表格渲染器。

创建自定义的内存渲染器

这个方式需要更多的工作,但是可以控制内存监视器对用户的展示。另外,你可以在调试器中定义新的内存渲染器类型来提供内存监视支持,然后使用自定义的渲染器类型来展示内存监视器。图1中的十六进制树就是一个自定义的渲染器类型。

这篇文章教你怎样在调试器中添加内存监视支持。同时,也会解释怎样重用调试平台提供的表格渲染器。另外,这篇文章将会讨论在表格渲染器中的可用定制点。

运行实例

这篇文章附带了一个简单的实例,用来帮助学习怎么添加一个内存监视器支持到调试器中。这个例子由一个启动配置、调试模型对象、调试引擎组成。

运行这个例子:

1、 将例子解压到eclipse plugin目录

2、 重启工作区、重建一个“Debug Nothing”的启动配置

3、点击“Debug”

启动以后,内存视图会自动打开,“Add Memory Monitor”按钮变为可用。点击然后输入任一表达式,调试器就会模拟计算表达式为一个地址,然后你可以添加一个内存渲染器到视图中。

内存视图框架

为了能够添加内存监视器到你的调试器中,你需要对内存视图框架有一个基本的了解。图2是内存视图框架。

图2 内存视图框架

内存块Memory Block

一个内存块代表调试器中分配的一块内存。它是一个调试模型对象,扩展IMemoryBlock或者IMemoryBlockExtension。在后面的章节我们会讨论IMemoryBlock与IMemoryBlockExtension的不同。

内存块管理器Memory Block Manager

内存块管理器管理工作台中的所有内存块。你可以使用内存块管理器查询当前显示的内存块。另外,当一个新的内存块被添加或删除时,管理器会广播添加删除事件。你可能向内存块管理器注册一个监听,用来接收这些事件的通知。

内存视图

内存视图是一个内存渲染位置。内存渲染地址中存放了工作台拥有的内存渲染器。内存视图同时提供了一个同步服务,使得同一个内存渲染地址中的渲染器可以交互。

内存渲染类型

一个内存渲染类型表示一种内存渲染方式。它是通过plugin.xml提供的。一个内存渲染类型指定一个渲染类型代理,代理的作用就是在内存视图中创建一个内存渲染器。内存渲染类型不会绑定到某个调试模型上,它是在工作台全局定义的。重用一个已经存在的渲染类型,模型必须创建一个内存渲染绑定来将渲染类型绑定到模型上。

内存渲染绑定

定义对一个调试模型起作用的内存渲染类型。可以通过plugin.xml配置。

内存渲染管理器

管理工作台中所有的渲染类型和渲染绑定。

为了使用内存视图,你的调试器必须能够创建并返回一个内存块。内存块用来从调试引擎/系统中获取内存。另外,你的调试器必须定义你所需要的内存渲染绑定。下面的章节将会解释怎样向你的调试器中添加内存块,也会讲到如何定义内存渲染绑定和重用调试平台提供的内存渲染器。

向调试器添加内存监视器

你的调试模型需要扩展两个关键的接口:

1. 调试目标必须扩展IMemoryBlockRetrieval或者IMemoryBlockRetrivalExtension。IMemoryBlockRetrieval和它的扩展,能够在需要的时候向调试目标查询内存块。

2. 调试模型必须扩展IMemoryBlock或者它的扩展IMemoryBlockExtension。它们代表了调试器中的内存监视。在用户需要查询内存时,通过这个接口与调试模型进行交互。

扩展IMemoryBlockRetrieval

一般由调试目标扩展这个接口。扩展的两个方法:

IMemoryBlockRetrieval:

public boolean supportsStorageRetrieval();

public IMemoryBlock getMemoryBlock(long startAddress, long length) throws DebugException;

supportsStorageRetrieval()方法允许用户查询调试目标是否支持内存块查看。如果返回true,”Add Memory Moditor”的按钮会变为可用,否则,将一直不可用。

getMemoryBlock()方法允许用户从调试目标中请求一个内存块。调用,调试目标会创建并返回一个内存块,这个内存块就是你所给的起始地址加上长度。如果创建出现问题,调试目标需要通过抛出DebugException报告一个错误。

IMemoryBlock和IMemoryBlockRetrieval允许用户创建具有基本功能的简单内存监视器。比如,扩展IMemoryBlock,将限制用户只能查看固定范围的内存,用户不能查看超过范围(起始地址加长度)的内存块。

为了提供更多的高级功能给用户,调试模型必须扩展IMemoryBlockRetrievalExtension和与它对应的IMemoryBlockExtension。IMemoryBlockRetrievalExtension要求调试模型扩展额外的方法:

IMemoryBlockRetrievalExtension:

public IMemoryBlockExtension getExtendedMemoryBlock(String expression, Object context)throws DebugException;

当请求一个内存块时,用户通过IMemoryBlockRetrievalExtension来向调试目标请求IMemoryBlockExtension。调用时,getExtendedMemoryBlock()方法将给定的表达式转化为一个地址,然后返回一个IMemoryBlockExtension。如果这个过程出错,调试目标需要通过抛出DebugException报告一个错误。

SmapleDebugTarget示例扩展了IMemoryBlockRetrievalExtension:

public IMemoryBlockExtension getExtendedMemoryBlock(String expression,Object context) throws DebugException {

// ask debug engine for anaddress

BigIntegeraddress = getEngine().evaluateExpression(expression, context);

// if address can beevaluated to an address, create memory block

if (address != null)

{

IMemoryBlockExtensionmemoryBlock = newSampleMemoryBlock(this, expression, address);

fMemoryBlocks.add(memoryBlock);

returnmemoryBlock;

}

// otherwise throw debugexception

IStatus status = newStatus(IStatus.ERROR, "example.debug.memoryview", 0, "Expressioncannot be evaluated to an address", null);

DebugException exception =new DebugException(status);

throw exception;

}

当请求一个内存块时,调试目标将请求发送给调试引擎来计算地址,如果地址计算成功,返回一个SampleMemoryBlock,它扩展了IMemoryBlockExtension。如果失败则抛出异常。

IMemoryBlockRetrievalExtension和IMemoryBlockRetrieval选择

IMemoryBlockRetrieval和IMemoryBlock在eclipse2.0创建,是一套允许调试目标创建一个给定地址的简单内存块的简单API,内存块结果是固定的,而且只允许调用者从整个内存块中查看内存。当一个IMemoryBlock在渲染器中显示时,用户不能查看超出范围的内存块。因为扩展这些接口只需要很少的方法,所以使用起来比较简单。

IMemoryBlockRetrievalExtension和IMemoryBlockExtension在eclipse3.1中引入。它提供了丰富的方法集来允许用户获取目标系统的更多信息。由于IMemoryBlockRetrievalExtension能够根据一个表达式或者调试上下文创建内存块,所以在创建一个内存监视器时不会被强制输入一个地址。另外,内存块结果(一个IMemoryBlockExtension)是动态的,允许调用者从任意地址查看内存。允许在表格渲染器中动态使用滚动条,允许用户在系统的任意可用地址查看内存。

下表总结了IMemoryBlockRetrievalExtension和IMemoryBlockRetrieval的区别:

IMemoryBlockRetrieval

IMemoryBlockRetrievalExtension

Creates IMemoryBlock , a basic static memory block. Does not offer as much functionality, but easier to implement.

Creates IMemoryBlockExtension ,provides much more functionality. More difficult to implement.

User must enter an address and length to create a memory monitor.

User can enter an arbitrary expression when creating a memory monitor (e.g. variable name).

Content of the resulting memory monitor must be retrieved as a whole and dynamic scrolling is not allowed.

Resulting memory monitor can retrieve memory from any valid location, which enables dynamic scrolling in table renderings

谁能帮我画下java这个过程的内存图

super();   方法是指调用该类的父类的构造方法   super方法的参数个数,类型都与父类的构造方法一致,否则编译不通过

在此处 就相当于在 子类 Dog 中的 构造方法里 调用了 它的父类-Animal类中的构造函数Animal("小狗")

调用的结果就是把Dog类中的name属性赋值成了"小狗"。

这里需要注意的一点是:在构造方法中调用父类的构造方法时,super()方法必须写在构造方法的第一句,否则编译会不通过

写出java代码,如何声明数组,分配内存给数组,并给数组指定初始值

java 里没有c中的malloc,只有new关键字会分配内存。

primitive types(int, float, double, char, boolean, byte)

分步:

int[] array // 此时jvm未分配内存

array = new int[2]; //此时分配内存,2个int

一步:

int[] array = {1,2}

object types (Object)

分步:

Object[] objs; // 此时jvm未分配内存

objs = new Object[2]; // 此时jvm分配了数组本身用的内存,但数组内元素内存未分配。

objs[0] = new Object(); // 此时分配内存

objs[1] = new Object(); // 此时分配内存

一步:

Object[] objs = {new Object(), new Object()};

根据代码,画出内存图(栈内存+堆内存)

show(new Demo());语句,是在堆中i建一个对象,那么内存分配给这个对象的地址是指向的是变量d,只不过这个d和上边的那个d是不同的。这个是局部变量是在这个方法内部的变量。

jvm栈以帧为单位保存线程的状态,当线程激活一个方法时,jvm就会创建一个当前帧来保存参数,局部变量,中间计算过程和其他数据。

(1) 堆栈。驻留于常规RAM(随机访问存储器)区域,但可通过它的“堆栈指针”获得处理的直接支持。堆栈指针若向下dao移,会创建新的内存;若向上移,则会释放那些内存。

这是一种特别快、特别有效的数据保存方式,仅次于寄存器。创建程序时,Java编译器必须准确地知道堆栈内保存的所有数据的“长度”以及“存在时间”。

(2) 堆。一种常规用途的内存池(也在RAM区域),其中保存了Java对象。和堆栈不同,“内存堆”或“堆”(Heap)最吸引人的地方在于编译器不必知道要从堆里分配多少存储空间,也不必知道存储的数据要在堆里停留多长的时间。

因此,用堆保存数据时会得到更大的灵活性。要求创建一个对象时,只需用new命令编制相关的代码即可。

扩展资料:

单片机应用中,堆栈是个特殊存储区,堆栈属于RAM空间的一部分,堆栈用于函数调用、中断切换时保存和恢复现场数据。堆栈中的物体具有一个特性:第一个放入堆栈中的物体总是被最后拿出来, 这个特性通常称为先进后出 (FILO—First-In/Last-Out)。

堆栈中定义了一些操作, 两个最重要的是PUSH和POP。 PUSH(入栈)操作:堆栈指针(SP)加1,然后在堆栈的顶部加入一 个元素。POP(出栈)操作相反,出栈则先将SP所指示的内部ram单元中内容送入直接地址寻址的单元中(目的位置),然后再将堆栈指针(SP)减1。这两种操作实现了数据项的插入和删除。

参考资料来源:百度百科-堆栈


本文名称:写出Java代码内存图解 java写一段代码内存溢出
文章位置:http://jkwzsj.com/article/ddjgjsp.html

其他资讯