JAVA具有自动的垃圾回收机制,不需要释放内存的 *** 作;
垃圾回收能自动释放内存空间,减轻编程的负担。这使Java 虚拟机具有一些优点。首先,它能使编程效率提高。在没有垃圾回收机制的时候,可能要花许多时间来解决一个难懂的存储器问题。在用Java语言编程的时候,靠垃圾回收机制可大大缩短时间。其次是它保护程序的完整性, 垃圾回收是Java语言安全性策略的一个重要部份。
垃圾回收的一个潜在的缺点是它的开销影响程序性能。Java虚拟机必须追踪运行程序中有用的对象,而且最终释放没用的对象。这一个过程需要花费处理器的时间。其次垃圾回收算法的不完备性,早先采用的某些垃圾回收算法就不能保证100%收集到所有的废弃内存。当然随着垃圾回收算法的不断改进以及软硬件运行效率的不断提升,这些问题都可以迎刃而解。
一个程序可以在内存里面存在多个运行实例 比如 你可以打开多个微软的Word程序 但是 有些时候我们需要控制程序运行的实例只有一个 也就是说 该程序同一时刻在内存里面运行的只有一个实例 这样当这个程序在内存中已经存在一个运行实例而用户又再次运行了该程序的时候 有两种结果 第一种结果是结束目前的运行实例 打开新运行的实例 第二种就是让新运行的实例退出 原有的运行实例继续运行 原理 因为任何时候只有一个实例 所以在实现这种功能的时候必须借助只能被独享的资源 如果我们的程序是基于某个平台的 那么就可以借助 *** 作系统的内核对象来完成 比如Windows *** 作系统就提供了CreateMutex这个API来创建一个独享的内核对象 但是因为要考虑平台无关 Java程序的实例控制不应该使用系统的内核对象来完成 那么我们就必须找到其它的 可以独享的资源 实际上 一台机器无论是在什么 *** 作系统上 网络端口都是独享的 也就是说基于网络端口这个独享的原理 我们可以很方便地让我们的Java程序实现在内存里面只有一个运行实例这个功能 而且这个功能的实现是与平台无关的 实现 我们先来看看第一种情况是如何实现的 也就是说如果系统中已经存在运行实例的话 那么结束原有的运行实例 让新实例运行 这个实现实例控制的Java类也是一个线程 具体的实现如下 import ;public class InstanceControl extends Thread { public void run() { try{ Socket sock = new Socket( ); //创建socket 连接 端口} catch (Exception e) {} try{ ServerSocket server = new ServerSocket( );//创建socket 在 端口监听 server accept(); //等待连接 server close(); //有连接到来 也就是说有新的实例 System exit( ); //这个实例退出 }catch (Exception e) { e printStackTrace(); } }} 下面这个Java程序的程序入口是没有实例控制功能的 public class ProgramMain { public static void main(String argv[]) { mainFrame frame = new mainFrame(); }} 现在想加入实例控制 只需要添加两行代码 添加后代码如下所示 public class ProgramMain { public static void main(String argv[]) { InstanceControl ic = new InstanceControl(); ic start(); mainFrame frame = new mainFrame(); }} 在这个基础上 要实现第二种情况 也就是已经有实例运行的情况下 新的实例退出 保持原有的运行实例 就只需要一点小的改动了 具体的实现如下 import ;public class InstanceControl extends Thread { public void run() { try{ Socket sock = new Socket( );//创建socket 连接 端口 System exit( ); //连接成功 说明有实例存在 则退出 }catch (Exception e) {} try{ ServerSocket server = new ServerSocket( );//创建socket 连接 端口 while (true) {server accept(); //接受连接请求 } }catch (Exception e) { e printStackTrace(); } }} 这个类的使用方法和第一种情况的那个类是一样的 只需要在原有的代码上加入两行代码即可 InstanceControl ic = new InstanceControl();ic start(); 扩展 上面的程序也许有一个小bug 就是如果程序在开始运行时ServerSocket监听的端口已经被其它程序占用 那么程序的运行就会受到影响 所以程序的端口应该尽量取得大一些 在这种情况下其它程序占用这个程序使用的端口的概率是可以忽略不计的 同时 还可以做两种扩展 第一种是把端口写在配置文件中 可通过读配置文件得到端口 这样就能够在其它程序占用目前端口的情况下改变这个程序使用的端口 还有一种是在运行的时候用两个InstanceControl类分别在两个端口监听 只要有一个InstanceControl类得到连接就做出响应 这样两个端口都被其它程序占用的概率就更加的微乎其微了 lishixinzhi/Article/program/Java/Javascript/201311/25374
以上就是关于怎样释放JAVA程序运行中所用的内存全部的内容,包括:怎样释放JAVA程序运行中所用的内存、让Java程序只运行一个实例、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)