java 怎么手动释放数组

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 怎么手动释放数组相关的知识,希望对你有一定的参考价值。

我申请了一个数组

byte[] tbytes = new byte[100];

需要在特定的时候手动释放他,给他从新分配空间,新空间和原来的大小是不一样的,
比如需要:
delete tbytes;
tbytes = null;
tbytes = new byte[200];

在java里该怎么实现?貌似没有delete

java当中数组是不需要手动释放的,底层有自动回收垃圾的机制,扩展如下:
前一次循环结果如果没有被引用,那么会等待被自动释放,如果被引用,则不释放。
String[] str2=new String[500];
意思是每次循环都重新定义,并且重新赋值为新创建的数组对象,而上次循环所声明的变量以及所创建的数组对象都被列入自动回收列表了。
参考技术A java没有提供直接操作内存的api。只能期待内存回收机制了。当那块内存地址没有任何引用的指向它的时候,就会被回收。。。理论上是这样。你直接tbytes = new byte[200];就可以了。 参考技术B JVM会自动回收被置为null的对象
你在不使用该数组的时候将其置为null
JVM就会自动回收了
当然,你可以再加上一句System.gc();
提醒JVM强制回收垃圾
参考技术C tbytes = null 就可以了

gc会自动收拾的本回答被提问者采纳

如何手动释放一个java线程占用的资源

我做一个聊天软件 我双击一个好友头像时 执行一个线程 弹出一个窗口 线程里 run方法是用来接收信息的,但是当我把当前窗口关掉想再一次打开时,却提示端口被占用
我找到了地方是上一个窗口弹出的时执行的线程里面占用着10000这个端口 我没有停掉上一个窗口的线程,所以上一个窗口占用的那个10000的端口没有释放掉
那么请问大神们 如何手动停止线程,并且释放掉run方法里面占用的端口
因为run方法里面有DatagramSocket类的receive方法,这个是阻塞式的没有接受到信息就不会往下执行,所以所占用的端口没有释放掉
大神们 要如何释放掉哇?
public void run()

try

while(true)

DatagramSocket ds=new DatagramSocket(10000);
byte buffer[]=new byte[1024*64];
DatagramPacket dp=new DatagramPacket(buffer,buffer.length);
System.out.println("OK1");
ds.receive(dp);
System.out.println("OK2");
String mess=new String(dp.getData(),0,dp.getLength());
Date d=new Date();
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd kk:mm:ss ");
String str=sdf.format(d);
recArea.append(str+"\n");
recArea.append(mess+"\n");
ds.close();


catch(Exception e)

System.out.println(e.getMessage());


线程里面的run方法
就是 DatagramSocket ds=new DatagramSocket(10000);这句占用着10000端口没有释放掉

建议你声明一个boolean变量替换while(true)中的true,因为这样就可以控制线程了,然后不必等到主程序结束 参考技术A 你写的是while true,而且代码块里面没有跳出的语句,也就是说,除非发生异常,否则该线程将一直在这个死循环中运行。 参考技术B while里面不要用true,用用变量代替,就可以控制线程的运行与否。或者将socket对象设置为全局,那样就可以手动改变此socket的属性。

以上是关于java 怎么手动释放数组的主要内容,如果未能解决你的问题,请参考以下文章

如何手动释放一个java线程占用的资源

无法从数组队列中手动释放内存

如何手动释放Linux内存?

如何手动释放Linux内存的方法

怎么用new定义一个类数组,并且释放内存

JNI内存方面说明以及相关类型手动释放内存