精华内容
下载资源
问答
  • 我这里的原因就是60的数据数据循环创建对象进行赋值,导致内存不足,这里解决的方案有很2种,一种是创建临时表,一种就是把循环创建对象这个操作优化。 这个循环创建对象可以用浅拷贝来解决。 首先在创建对象的类加 ...

    如果在项目代码运行的过程中发现报错java.lang.OutOfMemoryError: GC overhead limit exceeded
    我这里的原因就是60的数据数据循环创建对象进行赋值,导致内存不足,这里解决的方案有很2种,一种是创建临时表,一种就是把循环创建对象这个操作优化。
    这个循环创建对象可以用浅拷贝来解决。

    首先在创建对象的类加 implements Cloneable

    @Override
        public Object clone() throws CloneNotSupportedException{
            //浅拷贝
            return (Object)super.clone();
        }
    

    然后循环体外new一个对象,循环的时候

    Object object = new Object();
    try {
                Object object = object.clone();
            }catch (CloneNotSupportedException e){
                e.printStackTrace();
            }
    

    这样就会解决内存溢出的问题。

    展开全文
  • Java开发环境中的JDK lambda foreach 创建对象 @Async public void asyncFullEsDoc() { List docIdList = Arrays.asList(913,914); if (CollectionUtil.isNotNullOrEmpty(docIdList)){ List documents = new ...

    在这里插入图片描述
    Java开发环境中的JDK lambda foreach 创建对象
    @Async
    public void asyncFullEsDoc() {
    List docIdList = Arrays.asList(913,914);
    if (CollectionUtil.isNotNullOrEmpty(docIdList)){
    List documents = new ArrayList<>(500);
    docIdList.forEach(docId ->{
    QueryKnowledgeDocResponse doc = synchronizeRedisBaseDoc(docId);
    if (!StringUtils.isBlank(doc)){
    Map<String, Object> docMap = BeanToMap.objectToMap(doc);
    Document document = new Document();
    document.setDocumentId(docId.toString()).setDocument(docMap);
    documents.add(document);
    }
    }); …
    }
    }
    分析,对象释放优化

        List<Document> documents = new ArrayList<>(500);
            Document document = new Document();
            docIdList.forEach(docId ->{
                //用于对象释放
                document.setDocumentId(null);
                document.setDocument(null);
                QueryKnowledgeDocResponse doc = synchronizeRedisBaseDoc(docId);
                if (!StringUtils.isBlank(doc)){
                    Map<String, Object> docMap = BeanToMap.objectToMap(doc);
                    document.setDocumentId(docId.toString()).setDocument(docMap);
                    documents.add(document);
                }
            });    ...
       出现的bug,最后在addList时最后一个值覆盖了前面所有值,但是foreach中对象的每个对象值都是不同的。
       分析,代码继续优化。
    ...
        
    List<Document> documents = new ArrayList<>(500);
            Document document = null;
            for (Integer docId: docIdList) {
                document = new Document();
                QueryKnowledgeDocResponse doc = synchronizeRedisBaseDoc(docId);
                if (!StringUtils.isBlank(doc)){
                    Map<String, Object> docMap = BeanToMap.objectToMap(doc);
                    document.setDocumentId(docId.toString()).setDocument(docMap);
                    documents.add(document);
                }
            }
    ...
       如果我还是想用lambda foreach 创建对象
    ...
        List<Document> documents = new ArrayList<>(800);
            final Document[] document = new Document[1];
            docIdList.forEach(docId ->{
                QueryKnowledgeDocResponse doc = synchronizeRedisBaseDoc(docId);
                if (!StringUtils.isBlank(doc)){
                    Map<String, Object> docMap = BeanToMap.objectToMap(doc);
                    document[0] = new Document();
                    document[0].setDocumentId(docId.toString()).setDocument(docMap);
                    documents.add(document[0]);
                }
            });
    ...
    

    分析
    Object object= new Object();
    写在100个循环内等于你有100个引用对应了100个对象,所以100个对象在一段时间都占用内存,知道内存不足GC主动回收。
    object = new Object();
    写在100个循环内等于你使用1个引用分别100次调用了100个对象,所以当后一个对象init后,前一个对象已经是“无引用状态”,会很快的被GC自动回收(在你的循环还没结束时,可能已经进行了多次GC回收,这点重要)
    文章来自:https://www.itjmd.com/news/show-5347.html

    展开全文
  • 1.非要较真的话,就是第一种循环结束所有创建对象就可以被回收。第二种最后一个创建的要等到方法结束才会被回收 2.https://www.zhihu.com/question/31751468/answer/88626975 知乎哥们给的解释 或者 ...
    针对此问题,csdn上一般都有3种解释
    1.非要较真的话,就是第一种循环结束所有创建的对象就可以被回收。第二种最后一个创建的要等到方法结束才会被回收
    2.https://www.zhihu.com/question/31751468/answer/88626975 知乎哥们给的解释 或者  https://will-turner.iteye.com/blog/1604671的解释3.将变量声明在循环体外的做法的确节省不了多少空间,while长时间循环,确实节约了不少内存,约节约了50%或者更多,数据量小的场景未进行测试
    
    以上3种解释听着都很有道理,按知乎的方式进行反编译效果一致,但实际变异存在差异。根据以上认知亲测,代码运行时长无明显差异,差异点在于Edin
    内存消耗的区别
    
    故结论:二者均可以,建议使用外部构建对象(jdk 1.8.0_45)
    
    图三、图四属于编译器编译后的结果,若for对象在循环外定义.初始化为null或者未初始化为null,则编译的效果不同.不设置为null时则为知乎的哥们截图所示
    若设置则见图四,至于此种对内存的消耗暂为通过分析工具进行分析
    
    public class ForTestOut {
    
       public void out() {
    
          User user = null;
          while (true) {
             user = new User();
             user.setAge(0);
          }
    
       }
    
       public static void main(String[] args) {
          new ForTestOut().out();
       }
    }
    public class ForTestIn {
    
    
       public void in() {
    
          while (true) {
             User user = new User();
             user.setAge(0);
          }
       }
    
       public static void main(String[] args) {
          new ForTestIn().in();
       }
    }

     

     

     

    展开全文
  • public class Test { public static void main(String[] args) ...比如说上边这一段代码,越看越不对劲了,它难道是在main方法栈中先后创建了10个引用叫obj?然后每个obj指向不同的new出来的对象
  • .....Object obj = ...在创建对象时的几个关键应用规则:(1)避免在循环体中创建对象,即使该对象占用内在空间不在.(2)尽量及时使用对象符合垃圾回收标准.(3)不要采用过深的继承层次.(4)访问本地变量优于访问类中的变
    1. .....
    2. Object obj = null;
    3. for(int i=0; i<10000; ++i)
    4. {
    5.     obj = new Object();
    6. }
    7. ....

    在创建对象时的几个关键应用规则:

    (1)避免在循环体中创建对象,即使该对象占用内在空间不在.

    (2)尽量及时使用对象符合垃圾回收标准.

    (3)不要采用过深的继承层次.

    (4)访问本地变量优于访问类中的变量.

     

    关于规则(1)避免在循环体中创建对象.如下代码:

    1. .....
    2. for(int i=0; i<10000; ++i)
    3. {
    4.    Object obj = new Object();
    5.    System.out.println("obj="+obj);
    6. }
    7. ....

     

    但这样违反了上述规则(1).因为这样会浪费较大的内在空间.正确的方法如下所示:

     

    另外.不要对一个对象初始化多次.这同样会带来较大的内在开销.

    如:

    1. public class A
    2. {
    3.  private Hashtable table = new Hashtable();
    4.  public A()
    5. {
    6.  table = new Hashtable();//初始化了两次
    7. }
    8. }

     

    正确的方式:

     

    1. public class A
    2. {
    3. private Hashtable table = new Hashtable();
    4. public A()
    5. {
    6. }
    7. }
    展开全文
  • java之简单性能优化

    万次阅读 2019-11-13 23:23:14
    使用Java的开发者都知道,当某个对象被定义为stataic变量所引用,这个对象所占有的内存将不会被回收。有时,开发者会将经常调用的对象或者变量定义为static,以便提高程序的运行性能。因此,不是常用到的对象或者...
  • 情景:以下程序会不会有内存泄露,并分析它的内存大小走向 public static void newManyInteger(){ for(int i = 0;...假如对象再大的话,在下一次GC之前已经超过内存的大小,就会发生内存溢出
  • java面向对象

    万次阅读 多人点赞 2018-08-21 16:51:59
    包括面向对象概念、类与对象的关系、封装、构造函数、this关键字、static关键字、单例设计模式、继承、多态、内部类、异常、包等java基础知识。 1、面向对象 面向对象是相对面向过程而言 面向对象和面向过程都是...
  • 如何正确的创建和销毁Java对象

    万次阅读 2017-06-15 18:24:16
    Java是一门强大的高级语言。在学习了其基础知识后,我们仍需要理解其深刻的内涵。接下来,我们会以《Effective Java》一书做为Java进阶学习的载体,对Java进行一个系统的、全新的认识。...第一章:创建和销毁对象
  • 前言 循环就是让我们的程序...其中,for循环就是循环结构的一种,另外还有while循环和do-while循环语句。但是for循环是开发者最常用的开发方式。 一、增强for循环1. 三种常用for循环#普通for循环遍历 for (int i = 0;
  • Java实现面向对象编程

    万次阅读 2018-07-17 16:18:06
    目录 第1章... 10 抽象和封装......1.2通过创建对象实现领养宠物功能... 17 1.2.1创建类的对象... 17 1.2.2构造方法及其重载... 23 1.2.3常见错误... 28 1.3使用封装优化电子宠物系统的类... ...
  • Java代码如何进行优化

    千次阅读 2018-04-02 15:34:03
    Java代码优化Java编程开发很重要的一个步骤,Java代码优化要注重细节优化,一个两个的细节的优化,产生的效果不大,但是如果处处都能注意代码优化,对代码减少体积、提高代码运行效率是有巨大帮助的,还能在一定...
  • 首先,对于将会频繁创建对象,我们要让这个类实现Cloneable接口,因为这个优化的核心,就是利用clone。 clone的最大特点就是,不会去调用任何构造方法,所以,在我看来重点应该放在构造方法中。 废话少说,先上一...
  • 记得有过这个说法:在for循环之外,声明变量,然后再在for循环里面使用,这样的话,代码会好点。 那么这个说法OK不呢? 咱来测试一下,使用JProfiler来对比一下这个里面和外面的差别。 先看代码。 package ...
  • UDP网络编程之优化——DatagramSocket类   1、UDP协议循环发送数据——客户端 package cn.itcast_04; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import ...
  • java性能优化

    万次阅读 多人点赞 2015-04-14 16:46:51
    在不做编译优化的情况下,在循环中,循环条件会被反复计算,如果不使用复杂表达式,而使循环条件值不变的话,程序将会运行的更快。还有一个原则,决不在一个For语句中第二次调用一个类的方法 例子: class
  • 在JVM运行空间中,对象的整个生命周期大致可以分为7个阶段:创建阶段(Creation)、应用阶段(Using)、不可视阶段(Invisible)、不可到达阶段(Unreachable)、可收集阶段(Collected)、终结阶段(Finalized)与...
  • 在JVM运行空间中,对象的整个生命周期大致可以分为7个阶段:创建阶段(Creation)、应用阶段(Using)、不可视阶段(Invisible)、不可到达阶段(Unreachable)、可收集阶段(Collected)、终结阶段(Finalized)与...
  • 因为想在笔记中夹杂这篇文章中部分内容,所以进行了还是比较多的引用,核心的地方还是自己写的 可以一直接调转到深入理解Java的OOP 大纲 一、OOA 名称:Object-Oriented Analysis:面向对象分析方法 OOA是指...
  • java性能优化

    万次阅读 多人点赞 2015-04-14 15:04:09
    1. 谨慎对待Java循环遍历 Java中的列表遍历可比它看起来要麻烦多了。就以下面两段代码为例: A: private final List _bars; for(Bar bar : _bars) { //Do important stuff } B: private final List _bars...
  • java面试之JVM性能优化

    万次阅读 2020-09-27 23:38:28
    文章目录1、Java类加载过程2、java内存分配3、JVM加载Class文件的原理机制?4、GC是什么?为什么要有GC?5、简述Java垃圾回收机制。6、如何判断一个对象是否存活?(或者GC对象的判定方法)7、 垃圾回收的优点和原理。并...
  • 我们常常用到两个集合的数据比对,找到其中不同的数据,在Android里面基本上数据量也不会太大,往往大家都是直接用for循环嵌套搞定,大家有没有想过 当数据量很大的时候,使用for循环嵌套找出不一样的对象,需要多久...
  • Java面向对象(知识点整理)

    万次阅读 多人点赞 2021-02-22 08:53:55
    文章目录面向对象类与对象匿名对象创建对象的内存分析栈(stack)堆(heap)方法区PC寄存器本地方法栈内部类成员内部类局部内部类匿名内部类静态内部类包装类拆箱和装箱操作字符串转换基本数据类型和包装类型的区别...
  • 避免在循环体中创建对象

    千次阅读 2017-04-11 09:23:25
    下面是参考网络资源总结的一些在Java编程中尽可能要做到的一些地方。  1. 尽量在合适的场合使用单例  使用单例可以减轻加载的负担,缩短加载的时间,提高加载的效率,但并不是所有地方都适用于单例,简单来...
  • java代码优化

    千次阅读 2010-10-11 13:32:00
    java代码优化
  • Java程序优化细节

    千次阅读 2016-05-20 18:35:11
    Java程序优化
  • java代码性能优化

    千次阅读 2020-01-03 15:55:52
    日常代码中的性能优化
  • java一个对象占用多少字节?

    千次阅读 2019-06-26 12:32:41
    最近在读《深入理解Java虚拟机》,对Java对象的内存布局有了进一步的认识,于是脑子里自然而然就有一个很普通的问题,就是一个Java对象到底占用多大内存? 1、JAVA 对象布局 在 HotSpot虚拟机中,对象在内存中的...
  • java中锁的优化 -- JVM对synchronized的优化 1)锁消除 概念:JVM在JIT编译(即时编译)时,通过对运行上下文的扫描,去除掉那些不可能发生共享资源竞争的锁,从而节省了线程请求这些锁的时间。 举例: ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 115,897
精华内容 46,358
关键字:

java循环创建对象优化

java 订阅