说到java对象的创建,首先应该提下java的内存机制,最主要的两块应该就是堆内存和栈内存。

简单点来说栈内存主要是保存基本数据类型的值和保存引用变量,堆内存主要用来存放new产生的对象,数组。

堆是被所有线程共享的一块内存区域,在虚拟机启动的时候被创建。我的理解就是堆是用来存放实实在在东西的,而栈只是用来存放一个编号的。

好比你是个真实存在的人(编号9527,这个就是那些栈中引用指向的地方),你就是放在堆中,你的名字叫张三,而这个张三是放在栈中一个引用变量,你也可以有一个小名叫李二狗,这个李二狗和张三都是指向堆中9527这个对象。

其次还有方法区。方法区用来存放已被加载的类的信息、常量、静态变量。常量池是在方法区中而不是堆内存中,”AAA“字符串是在常量池的 ,new String(”AAA“),会在常量创建一个”AAA“字符串,还会在堆中创建一个字符串对象。

对象的创建:

1.避免创建不必要的对象,避免在方法内部创建对象,因为如果在方法内部创建对象XX xxx = new XXX();不考虑线程安全的条件下如果有N个线程调用该方法,那么就会创建N个XXX对象。

2.考虑使用单例模式

3.一些不需要改变的工具类可以使用static静态代码块来初始化。private static final XXX xxx;static {xxx = new XXX();},首先static 修饰的字段是属于类的,所有对象都可以使用,其次静态代码块只会在类加载的时候初始化一次也就只会创建一个XXX对象。

4.尽量使用基础数据类型,避免使用包装类,一是拆箱装箱耗时,二是对象比基础数据更占内存。可以试试:Long sum = 0L;for(int i = 0;i<Integer.MAX_VALUE;i++){sum += i;},将sum的生命改成基础数据类型long再试试。

对象的销毁:java中如果一个栈先增长,再收缩,那么从栈中弹出来的对象不会被当作垃圾回收,即使栈中已经不再引用这些对象。因为栈中还维护对这些对象的过期引用(永远也不会再被解除的引用)

1.某些情况下,可以考虑将某些引用置空告诉jvm这个对象已经没有引用了;即使后面再有使用也会抛出空异常,很快便可以发现问题。

2.避免调用finalizer 方法,子类如果重写该方法清除一些资源,切记在重写方法中还要手动调用父类的该方法super.finalizer ();而且最好是在finally中调用,保证不管发生什么异常父类的finalizer 方法都会执行

3.可以考虑提供一些清理资源的方法。比如io流相关类都提供close方法,数据库连接Connection也有close关闭连接

Effective java-对象的创建和销毁的更多相关文章

  1. Effective Java笔记一 创建和销毁对象

    Effective Java笔记一 创建和销毁对象 第1条 考虑用静态工厂方法代替构造器 第2条 遇到多个构造器参数时要考虑用构建器 第3条 用私有构造器或者枚举类型强化Singleton属性 第4条 ...

  2. [ Java学习基础 ] Java对象的创建和销毁

    类实例化可生成对象,实例方法就是对象方法,实例变量就是对象属性.一个对象的生命周期包括三个阶段:创建.使用和销毁. 创建对象 创建对象包括两个步骤:声明和实例化. 声明 声明对象与声明普通变量没有区别 ...

  3. [Effective Java]第二章 创建和销毁对象

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  4. Effective Java学习笔记--创建和销毁对象

    创建和销毁对象 一.静态工厂方法代替构造器 静态工厂方法的优缺点 优点: 1.可以自定义名称(可以将功能表述的更加清晰) 2.不必每次调用都创建新的对象(同一对象重复使用) 3.返回的类型可以是原返回 ...

  5. Effective Java读书笔记--创建和销毁对象

    1.优先考虑用静态工厂方法代替构造器2.遇到多个构造器参数时要考虑使用构建器Builder解决参数过多,不可变类型.私有构造方法,静态类的构造方法提供必要参数,剩下可选.new xxx.build() ...

  6. 图解JAVA对象的创建过程

    前面几篇博文分别介绍了JAVA的Class文件格式.JVM的类加载机制和JVM的内存模型,这里就索性把java对象的创建过程一并说完,这样java对象的整个创建过程就基本上说明白了(当然你要有基础才能 ...

  7. 深入理解Java对象的创建过程:类的初始化与实例化

    摘要: 在Java中,一个对象在可以被使用之前必须要被正确地初始化,这一点是Java规范规定的.在实例化一个对象时,JVM首先会检查相关类型是否已经加载并初始化,如果没有,则JVM立即进行加载并调用类 ...

  8. (转)深入理解Java对象的创建过程

    参考来源:http://blog.csdn.net/justloveyou_/article/details/72466416 摘要: 在Java中,一个对象在可以被使用之前必须要被正确地初始化,这一 ...

  9. Java对象的创建及使用

    Java对象的创建及使用 对象是类的具体实例(instance),是真实存在的个体:

随机推荐

  1. glib-dbus 在ubuntu9.10 和 ubuntu10.04 上安装环境的搭建

    dbus-glib 安装环境搭建 安装 dbus apt-get install dbus 安装 d-feet ,用于查看 session bus 和 system bus apt-get insta ...

  2. 【37】String,StringBuffer,StringBuilder区别和概念

    基本的概念: 查看 API 会发现,String.StringBuffer.StringBuilder 都实现了 CharSequence 接口,内部都是用一个char数组实现,虽然它们都与字符串相关 ...

  3. 数据结构---队列C语言实现

    #include <stdio.h> #include <stdlib.h> //队列大小 #define SIZE 1024 static int queue[SIZE] = ...

  4. 坚持自己的追求,迎来 “中国系统开发网” (CSDN)的专访

    坚持自己的追求,迎来 "中国系统开发网" (CSDN)的专访: 专访马根峰:海量数据处理与分析大师的中国本土程序员" http://www.csdn.net/articl ...

  5. Java继承与多态

    感慨一下,到了现在感觉Java里面很多东西都是模模糊糊,不能这样了,一点点解决吧.今天看了继承与多态的一些内容,感觉看得很浅,先写下来,算是巩固,如果后面看到更好的内容,再慢慢加上去. 继承与多态,他 ...

  6. SVN服务器搭建和配置使用详解

    SVN服务器搭建和使用(一) Subversion是优秀的版本控制工具,其具体的的优点和详细介绍,这里就不再多说. 首先来下载和搭建SVN服务器. 现在Subversion已经迁移到apache网站上 ...

  7. 【转载】Linux Cache Mechanism Summary(undone)

    http://www.cnblogs.com/LittleHann/p/3904909.html 目录 1. 缓存机制简介 2. 内核缓存机制 3. 内存缓存机制 4. 文件缓存机制 5. 数据库缓存 ...

  8. Day9 进程同步锁 进程队列 进程池 生产消费模型 进程池 paramike模块

    进程同步锁: 当运行程序的时候,有可能你的程序同时开多个进程,开进程的时候会将多个执行结果打印出来,这样的话打印的信息都是错乱的,怎么保证打印信息是有序的呢? 其实也就是相当于让进程独享资源. fro ...

  9. Angular6.0发布

    Angular v6 新版本重点关注工具链以及工具链在 Angular 中的运行速度问题. Angular v6 是统一整体框架.Material 和 CLI 三大 Angular 组件的第一个版本, ...

  10. 移动端h5实现复制功能

    首先遇到这个需求是就各种百度,但是发现基本都是用js实现,而且兼容性还非常不好. 但是在寻觅和尝试的过程中,发现只需要css代码也可以完全实现的,对需要复制内容的标签加上下面这几行代码就可以了. -w ...