一个关于java的new对象的问题,以及怎么有效减少不必要的内存占用
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一个关于java的new对象的问题,以及怎么有效减少不必要的内存占用相关的知识,希望对你有一定的参考价值。
假如我有十个类,而这十个类都有一个成员对象a,而且这十个类中的成员对象是一样的,请问我可以选择再开发一个类,里面new一个对象a,然后再在另外十个类中通过赋值的方法把该类中的a赋值给成员对象a,而不需要在十个对象中new十个成员对象a来赋值的方法。请问这样子做,可以有效减少不必要的内存占用吗?
还有一个问题就是关于静态变量初始化问题,如果我要引用数学类中Math.PI,那么是在使用的时候装载该静态量到内存中吗?还是在其它什么时候装载。看了一个关于new对象的文章,文章中说new对象之后就会装载该对象的静态变量。而类中的静态变量不是可以直接引用,而不需要new出来就可以用的吗?也就是说问下究竟静态成员变量是什么时候装载到内存中的?
静态成员变量 和 静态方法一样,在类被载入中就已经加载到内存空间里了。
类被载入的可能性
1:是java.lang 在JVM初始化时就被载入
2:类的某个子类初始化
3:存在于某个初始化的类的import中(例如使用java.sql.* 就会浪费空间,但是对于复杂的sql应用则可以提高运行速度)
等等
java本来就不是内存优化的好语言。
java在内存优化上的优势在于自动和手动 回收机制的配合。就是 我想优化就优化,不优化系统也会帮我优化。 参考技术A 你说的这个办法是可以的,只要成员对象a可以被你定义的类访问,或者提供访问成员a的接口就可以
静态变量是java虚拟机在程序运行的时候装载到内存中的, 参考技术B 可以考虑把对象a设置为单例的,但是同时你也要考虑单例情况下的并发处理。
Math.PI是一个常量,在类加载的准备阶段就会被分配到常量池的内存中,如果单单是使用Math.PI是不会产生实例对象的,并未对一个Math类的实例进行初始化构造。
new一个JAVA对象的时候,内存是怎么分配的?
new 对象的时候 在内存中 建立一个 内存区域 就是堆内存 用来存放对象的属性,当new完对象把对象的地址赋给对象的引用变量 这个时候 又在内存中建立一个区域 叫栈内存 用来存储 引用变量 引用变量存储对象的地址, 当对象没有被任何引用变量 引用的时候 就变成了 垃圾会被java的垃圾清除机制清除掉
以上是关于一个关于java的new对象的问题,以及怎么有效减少不必要的内存占用的主要内容,如果未能解决你的问题,请参考以下文章
关于java web的new File(),如果用绝对路径就可以用,如果用相对路径就有问题了,没把错也读不出来