说到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. butternife Zelezny自动注入插件

    插件地址:http://plugins.jetbrains.com/plugin/7369 Products: IntelliJ IDEA, RubyMine, WebStorm, PhpStorm, ...

  2. OpenCV——RGB三通道分离

    opencv 和 matlab 在处理彩色图像的时候,通道的存储顺序是不同的. matlab 的排列顺序是R,G,B: 而在opencv中,排列顺序是B,G,R. 下面通过一个小程序看看opencv中 ...

  3. NOSQL schema创建原则

    (1)数据规模 Bigtable类数据库系统(HBase,Cassandra等)是为了解决海量数据规模的存储需要设计的.这里说的海量数据规模指的是单个表存储的数据量是在TB或者PB规模,单个表是由千亿 ...

  4. 安卓系统底层C语言算法之测试参数是几个long型的算法

    #include <stdio.h> #define BITS_PER_LONG (sizeof(unsigned long) * 8) //求一个数x是几个long的长度 #define ...

  5. 关于IOS开发的基本书籍推荐

    1. Sams Teach Yourself iOS 5 Application Development in 24 Hours&lt;img src="https://pic4.z ...

  6. Java内部类与外部类

    错误提示: 没有任何类型 TestThread 的外层实例可访问.必须用类型 TestThread 的外层实例(例如,x.new A(),其中 x 是 TestThread 的实例)来限定分配. pu ...

  7. redis存入中文,取出来显示不正常

    问题: 127.0.0.1:6379> set name 张泰松OK127.0.0.1:6379> get name"\xe5\xbc\xa0\xe6\xb3\xb0\xe6\x ...

  8. Spring Cloud入门教程 - Zuul实现API网关和请求过滤

    简介 Zuul是Spring Cloud提供的api网关和过滤组件,它提供如下功能: 认证 过滤 压力测试 Canary测试 动态路由 服务迁移 负载均衡 安全 静态请求处理 动态流量管理 在本教程中 ...

  9. (转)Go语言并发模型:使用 context

    转载自:https://segmentfault.com/a/1190000006744213 context golang 简介 在 Go http包的Server中,每一个请求在都有一个对应的 g ...

  10. Hadoop的多节点集群启动,唯独没有namenode进程?(血淋淋教训,一定拍快照)(四十五)

    前言 大家在搭建hadoop集群时,第一次格式化后,一路要做好快照.别随便动不动缺少什么进程,就来个格式化. 问题描述:启动hadoop时报namenode未初始化:java.io.IOExcepti ...