静态方法与非静态方法的区别 及存储位置

Java 发表评论

生命周期:

 

静态方法:与静态成员变量一样,属于类的本身,在类装载的时候被装载到内存,不自动进行摧毁,会一直存在内存中,知道JVM关闭.

 

非静态方法:又叫实例化方法,属于实例对象,实例化后才会分配内存,必须通过类的实例来引用。不会常驻内存,当实例对象被JVM回收之后,也跟着消失。

 

效率:

静态方法的使用效率比非静态方法效率高。

 

按照上面的概念,只要内存够用,都可以使用静态的。使用静态方法会带来什么问题呢。

静态方法:是共享代码段,静态变量是共享数据段。既然是”共享”就有并发的问题。

非静态方法:是针对确定的一个对象的,所以不会存在线程安全的问题.

静态方法和实例方法是一样的,在类型第一次被使用时加载。调用的速度基本上没有差别。

 

 

例如:

  1. 不需要生成对象的  经常频繁使用的  工具类里的(如SqlHelper)
  2. 个人理解在多个类中需要调用并且是与对象无关的方法可设为静态方法。

 

优势与弊端:

在一些系统中使用非常平凡的方法都使用静态方法可以提高系统性能。

本身不可升级,重写,这要看一个软件产品的目的是什么。

为了方便,不用实例化,但这样程序编译运行时就占用了系统资源。

 

静态的属性和方法在程序启动的时候,就全部装入内存的,而不管这些方法、属性以后有没有用到。及时是没有人在访问程序,这部分内存任然不会释放。还有就是,所有访问者看到的静态属性的数据几乎都是一样的,比如A用户设置了UserName这个属性,B用户访问的时候,得到UserName任然是A用户设置那个。这种特性,如果用在固定数据中,那不会太大问题。

 

 

 

 

 

方法区:method(方法区)又叫静态区,存放所有的①类(class),②静态变量(static变量),③静态方法,④常量和⑤成员方法(就是普通方法,由访问修饰符,返回值类型,类名和方法体组成)。

 

堆:

jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身 

 

栈:

Java栈的区域很小,只有1M,特点是存取速度很快,所以在stack中存放的都是快速执行的任务,每个方法执行时都会创建一个栈帧(Stack Frame),描述的是java方法执行的内存模型,用于存储局部变量,操作数栈,方法出口,基本数据类型的数据,和对象的引用(reference)等。每个方法的调用都对应的出栈和入栈。

 

 

程序计数器(ProgramCounter)寄存器:

PC寄存器( PC register ):每个线程启动的时候,都会创建一个PC(Program Counter,程序计数器)寄存器。PC寄存器里保存有当前正在执行的JVM指令的地址。

 

 运行时常量池:

是方法区的一部分。Class文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池,用于存放编译器生成的各种字面量和符号引用,这部分内容将在类加载后进入方法区的运行时常量池中存放。

 

本地方法栈:

本地方法栈与Java虚拟机栈发挥的作用非常相似,它们之间的区别在于虚拟机栈为虚拟机执行java方法(也就是字节码文件)服务,而本地方法栈则为使用到Native方法服务。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

昵称 *