精华内容
下载资源
问答
  • 用到了java SE,swing,Thread等东东,当初经验少也没有做过严格的性能测试,布到生产环境用了一段时间后发现那个小程序有时候会抛java.lang.OutOfMemoryError异常,就是java内存溢出。当时也上网查了不少资料,试...

    我曾经在刚入行的时候做过一个小的swing程序,用到了java SE,swing,Thread等东东,当初经验少也没有做过严格的性能测试,布到生产环境用了一段时间后发现那个小程序有时候会抛java.lang.OutOfMemoryError异常,就是java的内存溢出。当时也上网查了不少资料,试过一些办法,代码也稍微做了些优化,但是有一个问题我始终是找不到解决的方案 - 不知为什么子窗体关闭后java的垃圾回收机制无法回收其资源,因为这个程序可能要经常开关一些子窗体,那么这些子窗体关闭后无法释放资源就造成了程序OutOfMemoryError的潜在的隐患!

    最近无意间在网上看到了一个监控java程序内存使用的工具 - JProbe,马上回想起那个未解决的难题,于是我就下载了JProbe8.0.0希望从分析内存入手找到我要的答案。软件下载安装后,在安装目录里详尽的用户指南(懂点软件和英语的人很快就能上手),主要是两个步骤:

    1.用JProbe Config工具根据提示生成J2SE或者J2EE程序的控制脚本(一个.jpl文件和一个.bat文件),在命令行里进入.bat文件所在的目录,然后执行该批处理让要监控的java程序跑起来

    2.运行JProbe Console工具,点击“Attach to Session...”按钮,弹出java程序的内存实时监控图表“Runtime Summary”,我们主要是看“Data”卡片里的内容(注意:第一次使用该软件可能会遇到一些小问题:比如发布为jar包的程序如果运行时会去读配置文件,从控制脚本启动的话,可能会发生配置文件找不到的异常,解决办法是:不要打jar包,直接就用文件夹发布;还有可能因为一些杀毒软件的网络防火墙导致JProbe无法连接到控制脚本的session,造成监控图表打不开,解决办法是:取消防火墙对于JProbe访问网络的限制)

    实时监控图表“Runtime Summary”如下图所示:

    12da3445eac315dfb9d2806cb30a6059.gif

    可以设置要监视的包或者类,然后点击“Refresh Runtime Data”按钮刷新这些对象占用内存的情况,当你觉得某个类比较可疑的话,你可以在不断的使用程序的过程中监视它的生命周期,看看它是否像预期的那样在结束了生命周期后占用的内存就被释放。众所周知:java的内存回收是自动进行的,无需程序员干预,我们称其为垃圾回收,这个垃圾回收可能是不定期的,就是当程序占用内存资源比较少的情况下可能jvm的垃圾回收频率就比较低;反之,java程序消耗内存资源比较多的情况下,垃圾回收的频率和力度就比较高,这种垃圾回收的不确定性很可能会影响我们的判断,但我们可以点击JProbe监控界面右上方的“Request a Garbage Collection”(像一个垃圾桶的图标)按钮来向jvm发出垃圾回收的请求,等几秒后再去点击“Refresh Runtime Data”,这个时候如果那个预期应该已经销毁的对象的类名还是没有从监控界面下方的class列中消失或者其对象数量没有减少的话(请多试几次,中间可以夹杂些其他增加程序内存使用的操作以确保jvm确实执行了垃圾回收),那恭喜你!90%的可能性你已经找到了程序的某个缺陷

    这个查找元凶的过程可能是相当耗时的,是对程序员的耐心的挑战。我熬了一下午一晚上,功夫不负有心人,基本上把我那个小程序的所有内存溢出的漏洞都找到并补上了。事实告诉我之前那个子窗体关闭后资源无法释放的根本原因是:子窗体虽然调用了dispose()方法,但是子窗体对象的引用一直都在:或者是被静态HashMap引用、或者是它的内部子线程类没有释放、或者是它的某个事件监听类没有释放(借用JProbe的火眼金睛一检验,发现问题真是一大堆啊!),so.我们要彻底释放某个对象占用资源的关键在于找到并释放所有对它的引用!

    下面是我解决具体问题的一些经验:

    程序中造成内存溢出可能性最大的是HashMap,Hashtable等等集合类,尤其是静态的,更是要慎之又慎!!!它们引用的对象可能你感觉已经销毁了,其实很可能你忘记remove键值,而如果这些集合对象还是静态的挂在其他类里面,那么这个引用可能一直都在,借用JProbe测试一下,结果往往出人意料,解决办法:彻底删除键,remove、clear,如果允许最好把集合对象设为null

    对于不再使用的线程对象,如果要彻底杀了它,很多书上都推荐用join方法,我之前也是这样做的,但后来借助JProbe工具我吃惊的发现这样做很可能要杀的线程仍旧好好的活在你日益增大的内存里,很可能调用了线程的sleep方法后用join方法就会有点问题,解决办法:在join方法前再加一句执行interrupt方法,不过这个时候可能会有新的问题:执行interrupt方法后你的线程类会抛InterruptedException,上有政策下有对策,加一个开关变量做判断就能完美解决,可参考下面的代码:

    Java代码  88f66083cb69c88aa5a04ea35d28d672.png

    /**

    Description: 创建线程的内部类

    * @author cuishen

    * @version 1.1

    */

    class NewThread implements Runnable {

    Thread t;

    NewThread() {

    t = new Thread(this, path);

    t.start();

    }

    public void run() {

    try {

    while(isThreadAlive) {

    startMonitor();

    Thread.sleep(Long.parseLong(controlList.get(controlList.size() - 1).toString()));

    }

    } catch (InterruptedException e) {

    if(!ifForceInterruptThread) {//开关变量

    stopThread(logThread);

    String error = "InterruptedException!!!" + path + ": Interrupted,线程异常终止!程序已试图重启该线程!!";

    System.err.println(error);

    LogService.writeLog(error);

    createLogThread();

    }

    }

    }

    }

    public void createLogThread() {

    ifForceInterruptThread = false;//开关变量

    logThread = new NewThread();

    }

    private void stopThread(NewThread thread) {

    try {

    thread.t.join(100);

    } catch (InterruptedException ex) {

    System.out.println("线程终止异常!!!");

    } finally {

    thread = null;

    }

    }

    /**

    * 关闭并彻底释放该线程资源的方法

    */

    public void stopThread() {

    try {

    ifForceInterruptThread = true;//开关变量

    isThreadAlive = false;

    logThread.t.interrupt();

    logThread.t.join(50);

    } catch (InterruptedException ex) {

    System.out.println("线程终止异常!!!");

    } finally {

    this.controlList = null;

    this.keyList = null;

    logThread = null;

    }

    }

    对于继承JFrame的窗体类,我们要注意在初始化方法中加入:this.setDefaultCloseOperation(DISPOSE_ON_CLOSE); ,并且注意和其关联的事件监听类一律写成窗体类的内部类,这样窗体dispose()的时候,这些内部类也一并销毁,就不会再有什么莫名其妙的引用了

    展开全文
  • 众所周知,Java是从C++的基础上发展而来的,而C++程序的很大的一个问题就是内存泄露难以解决,尽管Java的JVM有一套自己的垃圾回收机制来回收内存,在许多情况下并不需要java程序开发人员操太多的心,但也是存在泄露...

    前面一篇文章介绍了Java虚拟机的体系结构和内存模型,既然提到内存,就不得不说到内存泄露。众所周知,Java是从C++的基础上发展而来的,而C++程序的很大的一个问题就是内存泄露难以解决,尽管Java的JVM有一套自己的垃圾回收机制来回收内存,在许多情况下并不需要java程序开发人员操太多的心,但也是存在泄露问题的,只是比C++小一点。比如说,程序中存在被引用但无用的对象:程序引用了该对象,但后续不会或者不能再使用它,那么它占用的内存空间就浪费了。

    我们先来看看GC是如何工作的:监控每一个对象的运行状态,包括对象的申请、引用、被引用、赋值等,当该对象不再被引用时,释放对象(GC本文的重点,不做过多阐述)。很多Java程序员过分依赖GC,但问题的关键是无论JVM的垃圾回收机制做得多好,内存总归是有限的资源,因此就算GC会为我们完成了大部分的垃圾回收,但适当地注意编码过程中的内存优化还是很必要的。这样可以有效的减少GC次数,同时提升内存利用率,最大限度地提高程序的效率。

    总体而言,Java虚拟机的内存优化应从两方面着手:Java虚拟机和Java应用程序。前者指根据应用程序的设计通过虚拟机参数控制虚拟机逻辑内存分区的大小以使虚拟机的内存与程序对内存的需求相得益彰;后者指优化程序算法,降低GC负担,提高GC回收成功率。

    通过参数优化虚拟机内存的参数如下所示:

    Xms

    初始Heap大小

    Xmx

    java heap最大值

    Xmn

    young generation的heap大小

    Xss

    每个线程的Stack大小

    上面是三个比较常用的参数,还有一些:

    XX:MinHeapFreeRatio=40

    Minimum percentage of heap free after GC to avoid expansion.

    XX:MaxHeapFreeRatio=70

    Maximum percentage of heap free after GC to avoid shrinking.

    XX:NewRatio=2

    Ratio of new/old generation sizes. [Sparc -client:8; x86 -server:8; x86 -client:12.]-client:8 (1.3.1+), x86:12]

    XX:NewSize=2.125m

    Default size of new generation (in bytes) [5.0 and newer: 64 bit VMs are scaled 30% larger; x86:1m; x86, 5.0 and older: 640k]

    XX:MaxNewSize=

    Maximum size of new generation (in bytes). Since 1.4, MaxNewSize is computed as a function of NewRatio.

    XX:SurvivorRatio=25

    Ratio of eden/survivor space size [Solaris amd64: 6; Sparc in 1.3.1: 25; other Solaris platforms in 5.0 and earlier: 32]

    XX:PermSize=

    Initial size of permanent generation

    XX:MaxPermSize=64m

    Size of the Permanent Generation. [5.0 and newer: 64 bit VMs are scaled 30% larger; 1.4 amd64: 96m; 1.3.1 -client: 32m.]

    下面所说通过优化程序算法来提高内存利用率,并降低内存风险,完全是经验之谈,仅供参考,如有不妥,请指正,谢谢!

    1.尽早释放无用对象的引用(XX = null;)

    看一段代码:

    public List parse(HtmlPage page) {

    List list = null;

    try {

    List valueList = page.getByXPath(config.getContentXpath());

    if (valueList == null || valueList.isEmpty()) {

    return list;

    }

    //需要时才创建对象,节省内存,提高效率

    list = new ArrayList();

    PageData pageData = new PageData();

    StringBuilder value = new StringBuilder();

    for (int i = 0; i < valueList.size(); i++) {

    HtmlElement content = (HtmlElement) valueList.get(i);

    DomNodeList imgs = content.getElementsByTagName("img");

    if (imgs != null && !imgs.isEmpty()) {

    for (HtmlElement img : imgs) {

    try {

    HtmlImage image = (HtmlImage) img;

    String path = image.getSrcAttribute();

    String format = path.substring(path.lastIndexOf("."), path.length());

    String localPath = "D:/images/" + MD5Helper.md5(path).replace("\\", ",").replace("/", ",") + format;

    File localFile = new File(localPath);

    if (!localFile.exists()) {

    localFile.createNewFile();

    image.saveAs(localFile);

    }

    image.setAttribute("src", "file:///" + localPath);

    localFile = null;

    image = null;

    img = null;

    } catch (Exception e) {

    }

    }

    //这个对象以后不会在使用了,清除对其的引用,等同于提前告知GC,该对象可以回收了

    imgs = null;

    }

    String text = content.asXml();

    value.append(text).append("
    ");

    valueList=null;

    content = null;

    text = null;

    }

    pageData.setContent(value.toString());

    pageData.setCharset(page.getPageEncoding());

    list.add(pageData);

    //这里 pageData=null; 是没用的,因为list仍然持有该对象的引用,GC不会回收它

    value=null;

    //这里可不能 list=null; 因为list是方法的返回值,否则你从该方法中得到的返回值永远为空,而且这种错误不易被发现、排除

    } catch (Exception e) {

    }

    return list;

    }

    2.谨慎使用集合数据类型,如数组,树,图,链表等数据结构,这些数据结构对GC来说回收更复杂。

    3.避免显式申请数组空间,不得不显式申请时,尽量准确估计其合理值。

    4.尽量避免在类的默认构造器中创建、初始化大量的对象,防止在调用其自类的构造器时造成不必要的内存资源浪费

    5.尽量避免强制系统做垃圾内存的回收,增长系统做垃圾回收的最终时间

    6.尽量做远程方法调用类应用开发时使用瞬间值变量,除非远程调用端需要获取该瞬间值变量的值。

    7.尽量在合适的场景下使用对象池技术以提高系统性能

    展开全文
  • 原标题:Java虚拟机内存优化实践 众所周知,Java是从C++的基础上发展而来的,而C++程序的很大的一个问题就是内存泄露难以解决,尽管Java的JVM有一套自己的垃圾回收机制来回收内存,在许多情况下并不需要java程序开发...

    原标题:Java虚拟机内存优化实践

    94c2e979b0091951693df115c236cf92.png

    众所周知,Java是从C++的基础上发展而来的,而C++程序的很大的一个问题就是内存泄露难以解决,尽管Java的JVM有一套自己的垃圾回收机制来回收内存,在许多情况下并不需要java程序开发人员操太多的心,但也是存在泄露问题的,只是比C++小一点。比如说,程序中存在被引用但无用的对象:程序引用了该对象,但后续不会或者不能再使用它,那么它占用的内存空间就浪费了。

    我们先来看看GC是如何工作的:监控每一个对象的运行状态,包括对象的申请、引用、被引用、赋值等,当该对象不再被引用时,释放对象(GC本文的重点,不做过多阐述)。很多Java程序员过分依赖GC,但问题的关键是无论JVM的垃圾回收机制做得多好,内存总归是有限的资源,因此就算GC会为我们完成了大部分的垃圾回收,但适当地注意编码过程中的内存优化还是很必要的。这样可以有效的减少GC次数,同时提升内存利用率,最大限度地提高程序的效率。

    总体而言,Java虚拟机的内存优化应从两方面着手:Java虚拟机和Java应用程序。前者指根据应用程序的设计通过虚拟机参数控制虚拟机逻辑内存分区的大小以使虚拟机的内存与程序对内存的需求相得益彰;后者指优化程序算法,降低GC负担,提高GC回收成功率。

    通过参数优化虚拟机内存的参数如下所示:

    Xms

    初始Heap大小

    Xmx

    java heap最大值

    Xmn

    young generation的heap大小

    Xss

    每个线程的Stack大小

    上面是三个比较常用的参数,还有一些:

    XX:MinHeapFreeRatio=40

    Minimum percentage of heap free after GC to avoid expansion.

    XX:MaxHeapFreeRatio=70

    Maximum percentage of heap free after GC to avoid shrinking.

    XX:NewRatio=2

    Ratio of new/old generation sizes. [Sparc -client:8; x86 -server:8; x86 -client:12.]-client:8 (1.3.1+), x86:12]

    XX:NewSize=2.125m

    Default size of new generation (in bytes) [5.0 and newer: 64 bit VMs are scaled 30% larger; x86:1m; x86, 5.0 and older: 640k]

    XX:MaxNewSize=

    Maximum size of new generation (in bytes). Since 1.4, MaxNewSize is computed as a function of NewRatio.

    XX:SurvivorRatio=25

    Ratio of eden/survivor space size [Solaris amd64: 6; Sparc in 1.3.1: 25; other Solaris platforms in 5.0 and earlier: 32]

    XX:PermSize=

    Initial size of permanent generation

    XX:MaxPermSize=64m

    Size of the Permanent Generation. [5.0 and newer: 64 bit VMs are scaled 30% larger; 1.4 amd64: 96m; 1.3.1 -client: 32m.]

    下面所说通过优化程序算法来提高内存利用率,并降低内存风险,完全是经验之谈,仅供参考,如有不妥,请指正,谢谢!

    1.尽早释放无用对象的引用(XX = null;)

    看一段代码:

    public ListPageData parse(HtmlPage page) {

    ListPageData list = null;

    try {

    List valueList = page.getByXPath(config.getContentXpath());

    if (valueList == null || valueList.isEmpty()) {

    return list;

    }

    //需要时才创建对象,节省内存,提高效率

    list = new ArrayListPageData();

    PageData pageData = new PageData();

    StringBuilder value = new StringBuilder();

    for (int i = 0; i valueList.size(); i++) {

    HtmlElement content = (HtmlElement) valueList.get(i);

    DomNodeListHtmlElement imgs = content.getElementsByTagName(img);

    if (imgs != null !imgs.isEmpty()) {

    for (HtmlElement img : imgs) {

    try {

    HtmlImage image = (HtmlImage) img;

    String path = image.getSrcAttribute();

    String format = path.substring(path.lastIndexOf(.), path.length());

    String localPath = D:/images/ + MD5Helper.md5(path).replace(\\, ,).replace(/, ,) + format;

    File localFile = new File(localPath);

    if (!localFile.exists()) {

    localFile.createNewFile();

    image.saveAs(localFile);

    }

    image.setAttribute(src, file:/// + localPath);

    localFile = null;

    image = null;

    img = null;

    } catch (Exception e) {

    }

    }

    //这个对象以后不会在使用了,清除对其的引用,等同于提前告知GC,该对象可以回收了

    imgs = null;

    }

    String text = content.asXml();

    value.append(text).append(br/);

    valueList=null;

    content = null;

    text = null;

    }

    pageData.setContent(value.toString());

    pageData.setCharset(page.getPageEncoding());

    list.add(pageData);

    //这里 pageData=null; 是没用的,因为list仍然持有该对象的引用,GC不会回收它

    value=null;

    //这里可不能 list=null; 因为list是方法的返回值,否则你从该方法中得到的返回值永远为空,而且这种错误不易被发现、排除

    } catch (Exception e) {

    }

    return list;

    }

    2.谨慎使用集合数据类型,如数组,树,图,链表等数据结构,这些数据结构对GC来说回收更复杂。

    3.避免显式申请数组空间,不得不显式申请时,尽量准确估计其合理值。

    4.尽量避免在类的默认构造器中创建、初始化大量的对象,防止在调用其自类的构造器时造成不必要的内存资源浪费

    5.尽量避免强制系统做垃圾内存的回收,增长系统做垃圾回收的最终时间

    6.尽量做远程方法调用类应用开发时使用瞬间值变量,除非远程调用端需要获取该瞬间值变量的值。

    7.尽量在合适的场景下使用对象池技术以提高系统性能返回搜狐,查看更多

    责任编辑:

    展开全文
  • java程序内存优化

    2015-08-26 18:40:00
    面试常被问java的垃圾回收机制,感觉平时写代码很少用到,但是注重程序内存优化确实很重要。《EffectiveJava》这本书有几条讲的挺好,拿过来总结下吧。 首先简单的概括下java的内存回收机制。 java内存主要...

    面试常被问java的垃圾回收机制,感觉平时写代码很少用到,但是注重程序的内存优化确实很重要。《EffectiveJava》这本书有几条讲的挺好,拿过来总结下吧。

    首先简单的概括下java的内存回收机制。

    java内存主要是堆内存和栈内存,栈中的内存会在程序运行到所在作用域之外后进行回收。堆中的内存会在没有引用指向的时候,JVM虚拟机在某个时间段根据特定的算法进行回收。

    平时写程序注意如下几点,对程序进行内存优化

    1、避免创建不必要的对象

        a、使用基本类型替代装箱类型(享元模式)

        b、StringBuffer替代String

        c、使用单例模式(不推荐延迟加载)

        d、如果一个频繁调用的方法,每次调用都需要实力化对象,考虑静态初始化。如Clendar的实例化

    注:小对象的创建和回收都是非常廉价的,通过创建附加的对象提升程序的清晰性,简洁性,功能性是值得推荐的。不推荐使用自己维护的对象池。

    2、消除过期对象的引用

       a、对于类似数组,Collection中的对象容器,取出使用之后,可以置空。

       b、使用WeakHashMap做缓存。

    3、将局部变量的作用域最小化

       a、在第一次使用局部变量的时候声明该变量







    转载于:https://my.oschina.net/everyDay111/blog/497454

    展开全文
  • 众所周知,Java是从C++的基础上发展而来的,而C++程序的很大的一个问题是内存泄露难以解决,尽管Java的JVM有一套自己的垃圾回收机制来回收内存,在许多情况下并不需要java程序开发人员操太多的心,但也是存在泄露...
  • 小猿做了两年的c++,上个月竟然被调到java项目,于是第一篇随笔就想八一八java内存优化。首先优化这种事,肯定是应该放到最后去做的,不过在写代码的过程中养成良好的习惯也是很重要的。在这里先推荐一本书《编写...
  • Java内存优化

    2017-11-26 09:32:52
    在学习堆内存优化之前,我们要先了解一下有关堆内存优化的参数。堆在实现时,既可以实现成固定大小的,也可以是可扩展的,当前主流的虚拟机都是按照可扩展来实现的(通过-Xmx和-Xms控制)。  在这里通过程序测试...
  • java常见内存优化

    2019-09-05 10:26:01
    Java内存优化和性能优化的几点建议 1.没有必要时请不用使用静态变量 使用Java的开发者都知道,当某个对象被定义为stataic变量所引用,这个对象所占有的内存将不会被回收。有时,开发者会将经常调用的对象或者变量...
  • java内存优化-程序监控---------jconsole.exe,jvisualVM.exe 的使用
  • java内存优化

    2019-04-14 15:20:07
    java内存优化 一.概述 Java通过GC隐式回收内存,当一个对象不再使用且没有活动线程访问它时,GC便会将其回收用作新的内存。但是GC虽然负责回收不再使用(无法访问)的...在java程序中静态变量所占的内存一直都不会...
  • -Xms:设置Java应用程序启动时的初始堆大小 -Xmx:设置Java应用程序能获得的最大堆大小 -Xss:设置线程栈大小 -XX:MinHeapFreeRatio:设置堆空间最小空闲比例。当堆空间的空闲内存小于这个数值时,JVM将会拓展堆...
  • 1.没有必要时请不用使用静态变量使用Java的开发者都知道,当某个对象被定义为stataic变量所引用,这个对象所占有的内存将不会被回收。有时,开发者会将经常调用的对象或者变量定义为static,以便提高程序的运行性能...
  • 程序员:为什么程序总是那么慢?时间都花到哪里去了?面试官:若你写的 Java 程序,出现了性能问题,该怎么去排查呢?...可以监控 Java 程序在运行时占用的 CPU,及统计堆内存使用等。例如:每隔 10 毫秒采样 C...
  • 作为Android工程师,我看过很多关于Android内存泄漏的相关优化的文章,其中大部分都是告诉你该怎么做,做哪些,列...而想要能基本理解GC,就必须了解Java程序运行时的内存区域。没办法,学习学全套嘛。况且,我是...
  • 1. Java内存区域1.1 运行时数据区Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。主要包括:程序计数器、虚拟机栈、本地方法栈、Java堆、方法区(运 行时常量池)、直接内存。程序...
  • 就不得不说到内存泄露,众所周知,Java是从C++的基础上发展而来的,而C++程序的很大的一个问题就是内存泄露难以解决,尽管Java的JVM有一套自己的垃圾回收机制来回收内存,在许多情况下并不需要java程序开发人员操太多...
  • 一、JVM内存模型首先介绍下Java程序具体执行的过程:Java源代码文件(.java后缀)会被Java编译器编译为字节码文件(.class后缀);由JVM中的类加载器加载各个类的字节码文件,加载完毕之后,交由JVM执行引擎执行;在整个...
  • JAVa程序性能优化

    2019-09-20 19:19:28
    JAVa程序性能优化 懂得计算机性能的都知道,性能反应慢体现为:界面停顿,抖动,反应迟钝等性能的表现有: 执行速度:程序是否迅速,响应时间是否够短 内存分配:内存分配是否合理,是否过多的消耗内存或者...
  • 在《Java程序性能优化》3.12小节用一个例子说明在Java 6之前的版本(Java 7中已经解决)使用subString方法可能会带来性能的问题,但是并没有说明为什么会出现性能问题,我从JVM内存模型层面试着分析这个问题。...
  • 八、Java编程建议根据GC的工作原理,我们可以通过一些技巧和方式,让GC运行更加有效率,更加符合应用程序的要求。一些关于程序设计的几点建议:1)最基本的建议就是尽早释放无用对象的引用。大多数程序员在使用临时...
  • 1.没有必要时请不用使用静态变量使用Java的开发者都知道,当某个对象被定义为stataic变量所引用,这个对象所占有的内存将不会被回收。有时,开发者会将经常调用的对象或者变量定义为static,以便提高程序的运行性能...
  • 用到了java SE,swing,Thread等东东,当初经验少 也没有做过严格的性能测试,布到生产环境用了一段时间后发现那个小程序有时候会抛 java.lang.OutofMemoryError异常,就是java内存溢出。当时也上网查了不少资料,...
  • 用到了java SE,swing,Thread等东东,当初经验少也没有做过严格的性能测试,布到生产环境用了一段时间后发现那个小程序有时候会抛java.lang.OutOfMemoryError异常,就是java内存溢出。当时也上网查了不少资料,试...
  • java内存优化实践

    2015-08-18 14:31:00
    虽然jvm能够通过GC机制很智能地回收资源,但是由于内存的释放都是jvm在进行操作,不恰当的使用会导致java程序内存持续增大,直至最终OOM(out of memery)那么,如何对java进行内存优化呢?一方面可以通过调整jvm的...
  • 用到了java SE,swing,Thread等东东,当初经验少也没有做过严格的性能测试,布到生产环境用了一段时间后发现那个小程序有时候会抛java.lang.OutofMemoryError异常,就是java内存溢出。当时也上网查了不少资料,试...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,252
精华内容 1,700
关键字:

java程序内存优化

java 订阅