26 五月 2008

Java内存分配

原文地址:http://www.blogjava.net/Jack2007/archive/2008/05/21/202018.html

今天看了一下java的内存分配,分享一下:
基础数据类型直接在栈空间分配, 方法的形式参数,直接在栈空间分配,当方法调用完成后从栈空间回收。 引用数据类型,需要用new来创建,既在栈空间分配一个地址空间,又在堆空间分配 对象的类变量 。 方法的引用参数,在栈空间分配一个地址空间,并指向堆空间的对象区,当方法调用完成后从栈空间回收。局部变量 new 出来时,在栈空间和堆空间中分配空间,当局部变量生命周期结束后,栈空间立刻被回收,堆空间区域等待GC回收。 方法调用时传入的 literal 参数,先在栈空间分配,在方法调用完成后从栈空间分配。字符串常量在 DATA 区域分配 ,this 在堆空间分配 。数组既在栈空间分配数组名称, 又在堆空间分配数组实际的大小!
哦 对了,补充一下static在DATA区域分配。
其实是有规律的,只要你理解了这些个基本的原理:
堆空间的话: 操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删 除,并将该结点的空间分配给程序,另外,对于大多数系统,会在这块内存空间中的首地址处记录本次分配的大小,这样代码中的delete语句才能正确的释放 本内存空间。另外由于找到的堆结点的大小不一定正好等于申请的大小,系统会自动的将多余的那部分重新放入空闲链表中。是由new分配的内存,一般速度比较 慢,而且容易产生内存碎片,不过用起来最方便,另外,在WINDOWS下,最好的方式是用VirtualAlloc分配内存,他不是在堆,也不是在栈是直 接在进程的地址空间中保留一快内存,虽然用起来最不方便。但是速度快,也最灵活。是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来 存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵 活,也比较大。

栈空间的话:在Windows下, 栈是向低地址扩展的数据结构,是一块连续的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的,在WINDOWS下,栈的大小是固定 的(是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将提示overflow。因此,能从栈获得的空间较小。只要栈的剩余空间大于所申请 空间,系统将为程序提供内存,否则将报异常提示栈溢出。 由系统自动分配,速度较快。但程序员是无法控制的。

ok,头会不会有点小晕,不会的话继续吧:
JVM中的堆和栈
JVM是基于堆栈的虚拟机.JVM为每个新创建的线程都分配一个堆栈.也就是说,对于一个Java程序来说,它的运行就是通过对堆栈的操作来完成的。堆栈以帧为单位保存线程的状态。JVM对堆栈只进行两种操作:以帧为单位的压栈和出栈操作。
我们知道,某个线程正在执行的方法称为此线程的当前方法.我们可能不知道,当前方法使用的帧称为当前帧。当线程激活一个Java方法,JVM就会在线程的 Java堆栈里新压入一个帧。这个帧自然成为了当前帧.在此方法执行期间,这个帧将用来保存参数,局部变量,中间计算过程和其他数据.这个帧在这里和编译 原理中的活动纪录的概念是差不多的.
从Java的这种分配机制来看,堆栈又可以这样理解:堆栈(Stack)是操作系统在建立某个进程时或者线程(在支持多线程的操作系统中是线程)为这个线程建立的存储区域,该区域具有先进后出的特性。
每一个Java应用都唯一对应一个JVM实例,每一个实例唯一对应一个堆。应用程序在运行中所创建的所有类实例或数组都放在这个堆中,并由应用所有的线程 共享.跟C/C++不同,Java中分配堆内存是自动初始化的。Java中所有对象的存储空间都是在堆中分配的,但是这个对象的引用却是在堆栈中分配,也 就是说在建立一个对象时从两个地方都分配内存,在堆中分配的内存实际建立这个对象,而在堆栈中分配的内存只是一个指向这个堆对象的指针(引用)而已。

AWT的语义事件和低级事件

AWT事件分为语义事件(高级事件)和低级事件。语义事件是指表达用户行为的事件,例如,按钮单击,下拉列表的选择;所以经常使用的ActionEvent是语义事件。(最简单的区分语义事件和低级事件的方法是语义事件的监听器接口只需要实现一个方法即可)。低级事件是指形成事件的事件。例如,单击按钮的时候,必须按下鼠标。此时鼠标事件就是一个低级事件。

24 五月 2008

魔法泡泡-puyo-第三次修正(基本功能已实现)

更新:

1、添加了工具栏按钮的控制
2、添加了游戏帮助说明

待解决的问题:很多,很多,很多。比如界面美化,一些bug的测试,计分规则,代码的优化,内存效率问题的解决,环境的配置的优化(最好用配置文件进行管理),等等……

>
2008-05-24_110310.png



源码下载: 纳米盘 畅易网盘



上海gameloft的面试题上周日就做完了,大概花了10天时间。实际上主要功能一周内就全部实现,剩下的时间主要是一些bug的解决和代码的优化。接下来就等那边的电话了。

13 五月 2008

puyo-魔法泡泡-第二次修改版

更新:

1、解决了临界条件的处理,使得泡泡能够进行堆叠。
2、当泡泡停止下落时,产生新的泡泡进行控制。
3、产生随机的泡泡对位置。
3、解决部分bug。

需要解决的问题:

1、扫描消除算法的实现

2、计分规则的实现

3、代码结构优化

以下是程序界面:

puyo

源码下载:puyo2.7z
puyo2.7z

10 五月 2008

puyo-魔法泡泡-部分源代码下载

收到上海优酷的面试题,实现魔法泡泡的游戏。以下是试题内容:

Purpose:
----------

The goal of this exercise is to develop a JAVA or C/C++ version of Puyo-Puyo, a variation of the Tetris game.

We are interested in seeing your code writing skills, style and logic.
Don't hesitate to comment on your code in order to make it as clear as possible.

Please do not browse the web (or any other source of information) to find the code of this program already developed.

anyway feel free to browse the web to find a playable version of the game for reference.

The purpose of this exercise is purely a skill assessment, and gameplay implementation ability.

Rules of Game:
---------------

* Spheres come down from the top of the game board in pairs. A player can rotate them on their way down.

* Spheres come in 4 different colors: red, blue, green, and yellow

* Linking four spheres of the same color (horizontally, vertically or both(as in tetris)) removes them from the game board, allowing any sphere remaining to drop and fill the vacated space.
This may lead to several possible "chain combos" if additional colors match.

* The game board can be any size you want (we recommend 6x12)

* Note that the pair of spheres are not linked to each other. If one sphere is blocked because there is something underneath, the other one will continue falling (with no player control over it) until it reaches something.

The Zip Files Contain:
* 4 pictures of the spheres
* A screenshot of the game as it should look

as stated before, feel free to browse the web to find a playable version of the game for reference if some rules are unclear.

To Submit:
------------

Please submit a java or C/C++ console application that will open a window and start the game.
You may attach a separate text file that documents player controls and any other comments (as gameplay improvements, bugs not corrected, any comment that will help evaluate your submission...)

important:
- use Eclipse or Visual C++ as your IDE if you need one, DO NONT use JBuilder or C++ Builder
- java or C/C++ console application MUST be available
- it will be better to attach your project files and source code files
- ALL COMMENTS IN ENGLISH

这是我实现的界面:

puyo

因为白天上班,还得备课,所以挤时间,现在基本实现了随机产生一对泡泡,通过多线程键盘控制移动和变形以及自动下落,泡泡的移动全部用二维数组存储,并且每一次移动,下落或者变形都会产生对应的二维数组元素的变换。全部界面通过代码实现,没有借助其他设计工具。
接下来要解决的问题:
1、通过线程实现泡泡对的连续产生,临界条件的判断(即泡泡下落时,什么时候终止下落)
2、因为已经将泡泡和二维数组对应,所以当泡泡达到临界条件式,调用扫描算法进行泡泡的清除(这个过程需要扫描二维数组)。
3、一旦扫描完成,需要从二维数组重新读取图像信息,然后显示到窗体面板中。
4、一些计分规则的实现。
5、代码和工程结构的优化。

这是部分源代码: puyo.7z

puyo.zip