发现Java虚拟机内存泄露问题
【IT168 文档
】内存
泄露问题对于程序来说,是一个很难发现,并且容易引起严重灾害的事情。
Java一直以其垃圾回收机制为自豪,那是否这种机制就是完美的呢。
常规理解上,Java的内存
管理机制是将局部变量保存在堆中,当变量的作用域结束之后,该变量所占用的
内容会被自动回收。不需要做任何特殊的处理。比如下面的代码:
#div_code img{border:0px;}
public
class
JavaMemory{
private
final
int
dataSize
=
(
int
) (Runtime.getRuntime().maxMemory()
*
0.6
);
public
void
f(){
{
byte
[] data1
=
new
byte
[dataSize];
}
byte
[] data2
=
new
byte
[dataSize];
}
public
static
void
main(String[] args) {
JavaMemoryPuzzle jmp
=
new
JavaMemoryPuzzle();
jmp.f();
}
}
在这个例子中,方法f()里定义了两个局部变量,变量data1和data2的作用域不同。按照正常
理解,虽然两各个数组所需要的内存
之和已经超过了可用内存
,但是因为data1会被及时回收,不会出现内存
溢出错误。
如果我们实际执行这个例子,会发现出现了
java.lang.OutOfMemoryError错误。这是为什么?如果在BEA或者IBM的虚拟机上测试过这个例子,并不会出现错误。也就是
说,SUN的JVM在内存
回收机制上存在漏洞或者BUG。
这个问题该如何修正呢,方法其实很简单。只需要在变量作用域结束之前,将变量置为空就可以了。修改之后的结果如下:
#div_code img{border:0px;}
public
class
JavaMemory{
private
final
int
dataSize
=
(
int
) (Runtime.getRuntim
相关文档:
在成功实现Java调用C++之后,接下来想到能否通过JNA实现Java调用Fortran,今天试验了一下,还是比较容易的。
网上有一个Java调用F95的例子,但是我考虑不仅要实现F95的调用,还要实现F77的调用,所以费了一些周折。
问题的关键在于F77为过程名自动添加了一个尾部的下划线,所以sub1这个过程,到Java一端,就变成了sub1_, ......
Java中的startsWith和endsWith方法,在filter的功能实现中很方便,PHP可以用strncmp()
实现startsWith,但是无法实现endsWith,有些人会用正则来实现,但大多数人都不喜欢正则表达式的操作。
这里我通过一个叫substr_compare的方法实现(同时他也能实现sta ......
1. SerialBean
SerialBean是本类库与其他应用程序的接口。该类库中定义了SerialBean的构造方法以及初始化串口,从串口读取数据,往串口写入数据以及关闭串口的函数。具体介绍如下:
public SerialBean(int PortID)
本函数构造一个指向特定串口的SerialBean,该串口由参数PortID所指定。PortID = 1 表示COM1,PortID = 2 ......
import java.util.ArrayList;
import java.util.HashMap;
public class Client {
/**
* @param args
*/
public static void main(String[] args) {
test1();
System.out.println("==================================");
test2();
......
刚刚看到一篇文章提出c++多态与java多态不同的地方,基本意思如下:
请看C++代码:
class Base
{
public:
Base()
{
init();
}
virtual ~Base() {}
protected:
int value;
virtual void init()
{
value = 100; &nb ......