文档章节

Java的初始化机制、垃圾回收机制和内存分配机制

java_T
 java_T
发布于 2013/03/17 22:34
字数 1378
阅读 431
收藏 12

        刚才在网上看到一篇关于java初始化、垃圾回收机制和内存分配机制的文章,感觉不错,就拿来转发了,以后有空可以再看看,应该会有新的认识和新的收获。

文章:

2.1初始化顺序:

  1. public class Parent  
  2. {  
  3.     static Tipout   TIP = new Tipout("父类 static 成员 TIP 初始化");  
  4.     Tipout  tip = new Tipout("父类 成员 tip 初始化");  
  5.       
  6.     public Parent()  
  7.     {  
  8.         System.out.println("父类 构造函数 调用");  
  9.     }  
  10. }  
  11.   
  12. class Sub extends Parent  
  13. {  
  14.     static Tipout   SUB_TIP = new Tipout("子类 static 成员 SUB_TIP 初始化");  
  15.     Tipout  subTip  = new Tipout("子类 成员 subTip 初始化");  
  16.       
  17.     public Sub()  
  18.     {  
  19.         System.out.println("子类 构造函数 调用");  
  20.     }  
  21. }  
  22.   
  23. class Tipout  
  24. {  
  25.     public Tipout(String s)  
  26.     {  
  27.         System.out.println(s);  
  28.     }  
  29. }  

执行结果:

父类 static 成员 TIP 初始化
子类 static 成员 SUB_TIP 初始化
父类 成员 tip 初始化
父类 构造函数 调用
子类 成员 subTip 初始化
子类 构造函数 调用


由此可以总结出java初始化的顺序:
->所有静态成员初始化(父类->子类)
-->父类初始化(普通成员->构造函数)
--->子类初始化(普通成员-->构造函数)


!static成员初始化顺序只和类定义中的顺序有关。


调用静态数据和静态方法时,这个类中的所有静态成员都会被初始化(非static成员不会被初始化),前提是他们从未被初始化过。
测试代码:
  1. public class Parent  
  2. {  
  3.     public static Tipout    TIP = new Tipout("父类 static 成员 TIP 初始化");  
  4.     static  
  5.     {  
  6.         System.out.println("父类 static 代码块");  
  7.     }  
  8.     Tipout  tip = new Tipout("父类 成员 tip 初始化");  
  9.       
  10.     public Parent()  
  11.     {  
  12.         System.out.println("父类 构造函数 调用");  
  13.     }  
  14.       
  15.     public static void outMsg(){  
  16.         System.out.println("父类 static 函数 调用");  
  17.     }  
  18. }  

在Main()中调用:Parent.TIP.toString();
结果:


2.2垃圾回收


java中并不需要清除对象,也不存在C++中的析构函数,java的垃圾回收机制会自动释放无用的变量。
一个对象,可以有一个或多个引用变量指向它。当一个对象不再有任何一个引用变量指向它时,这个对象可以被垃圾回收机制回收了。
但是,并不是对象被抛弃后当即被回收的。JVM进程做空间回收有较大的系统开销。如果每当某应用进程丢弃一个对象,就立即回收它的空间,
势必会使整个系统的运转效率非常低下。


!不能操纵垃圾回收
使对象值为null,或者调用System.gc()
JVM接受这个消息后,并不是立即做垃圾回收,而只是对几个垃圾回收算法做了加权,使垃圾回收操作容易发生,或提早发生,或回收较多而已。

!垃圾回收器的运行时间是不固定的,清理工作的实际运行时间也是不能预知的。


2.3内存分配机制


2.3.1Java 把内存划分成两种:
1.栈内存,
基本类型的变量和对象的引用变量(存取速度比堆要快,仅次于寄存器)
2.堆内存。
堆内存用来存放由 new 创建的对象和数组。

!类跟数组一样,都是属于引用类型,引用类型就是指一堆对内存可以同时被多个栈内存指向。

java中主要存在4块内存空间:

栈内存空间:保存所有的对象名称(更准确地说是保存了引用的堆内存空间的地址)
堆内存空间:保存每个对象的具体属性内容。
全局数据区:保存static类型的属性。
全局代码区:保存所有的方法定义。


2.3.2 String缓冲池
缓冲池是java为了节省内存空间,会在内存中创建一个专门为String设计的缓冲池,用来保存已经存在的字符串,
如果2个字符串是一样的,则使用池中的字符串,不再创建新的对象
用下边的代码测试:
String str1 = "abc";   
String str2 = "abc";   
System.out.println(str1==str2); //true
结果为true,说明str1和str2指向同一个对象


String str1 =new String ("abc");   
String str2 =new String ("abc");   
System.out.println(str1==str2); // false  
用new则在堆中创建了2个对象


2.4应该注意的问题:



1.使用以下方式创建字符串
String str = "hello";
上面这种方式会创建一个"hello"字符串,而且JVM的字符缓存池还会缓存这个字符串。
String str = new String("hello");
此时程序除创建字符串外,str所引用的String对象底层还包含一个char[]数组,这个char[]数组依次存放了h,e,l,l,o


2.尽量减少对变量的重复计算
  1. for(int i=0;i<list.size();i++)  
应该改为
  1. for(int i=0,len=list.size();i<len;i++)  
并且在循环中应该避免使用复杂的表达式,在循环中,循环条件会被反复计算,如果不使用复杂表达式,而使循环条件值不变的话,程序将会运行的更快。


3.避免在循环体中声明创建对象

  1. for (int i = 0; i < 10000; i++) {    
  2.     Object obj = new Object();    
  3. }  
虽然性能上差别不大,但这样的代码会浪费栈内存空间,上边提到过引用变量会存放在栈内存,这样会在内存中产生大量的对象引用。

应该写成下边的:

  1. Object obj;  
  2. for (int i = 0; i < 10000; i++) {    
  3.     obj = new Object();    

本文转载自:http://blog.csdn.net/vestigge/article/details/8658687

java_T

java_T

粉丝 34
博文 73
码字总数 13320
作品 0
深圳
高级程序员
私信 提问
JVM内存管理和JVM垃圾回收机制

你对JVM内存组成结构和JVM垃圾回收机制是否熟悉,这里和大家简单分享一下,希望对你的学习有所帮助,首先来看一下JVM内存结构,它是由堆、栈、本地方法栈、方法区等部分组成,结构图如下所示...

laigous
2014/05/13
99
0
【转】Java之 内存区域和GC机制

转自:Leo Chin 目录 Java垃圾回收概况 Java内存区域 Java对象的访问方式 Java内存分配机制 Java GC机制 垃圾收集器 Java垃圾回收概况    Java GC(Garbage Collection,垃圾收集,垃圾回收...

rayner
2016/03/09
0
0
Java的JVM GC(Garbage Collection)垃圾回收原理机制及算法

Java的JVM GC(Garbage Collection)垃圾回收原理机制及算法 Java GC(Garbage Collection)垃圾回收机制,Java VM中,存在自动内存管理和垃圾清理机制。GC机制对JVM(Java Virtual Machine)...

开开心心过
2017/10/17
0
0
My java——JVM(垃圾回收)四

续My java——JVM(内存域) 中讲述了Java在JVM中的内存使用,其实在我们出来java程序时基本上有两个地方的内存处理 一是栈、二是堆,JVM会自动回收堆中的内存,也就我们所说的垃圾回收,那J...

tngou
2013/03/20
309
0
Android 之 内存管理

概述 在android的开发中,要时刻主要内存的分配和垃圾回收,因为系统为每一个dalvik虚拟机分配的内存是有限的,在google的G1中,分配的最大堆大小只有16M,后来的机器一般都为24M,实在是少的...

等待流星
2014/03/08
66
0

没有更多内容

加载失败,请刷新页面

加载更多

为什么?老程序员申请加薪至30K遭拒愤然辞职,公司转眼花35K招新

身在职场,经常会暗自打听同事工资,尤其是得知身边新入职同事的工资居然比自己高,还高出一大截时,心里自然很不平衡,一心想要离职。 那么,为什么公司宁愿花高价招聘新员工也不愿意给老员...

Java技术剑
1分钟前
1
0
云桌面到底是什么,企业该用云桌面吗

随着云计算和大数据时代的到来,当前企业里讨论最多的话题之一就是:企业到底要不要用云桌面这个话题的,有的人说企业应该使用云桌面的,因为可以降低使用成本和简化运维管理,同时也有的人说...

GZASD
6分钟前
1
0
技术分享 | gh-ost 原理剖析

作者简介: 杨奇龙,网名“北在南方”,7年DBA老兵,目前任职于杭州有赞科技DBA,主要负责数据库架构设计和运维平台开发工作,擅长数据库性能调优、故障诊断。 一、简介 上一篇文章(gh-ost ...

爱可生
9分钟前
2
0
手机短信删除了怎么恢复?几个方法就能恢复

  手机短信删除了怎么恢复?前几天有个小伙伴收到了一条来着面试的通知,这个面试对他很重要,但是可气的是刚好在清理手机里面的垃圾短信,然后收到了短信之后又被删除了,却又不知道该怎么...

科技第六人
24分钟前
4
0
浅谈Builder建造者模式

一、前言 Builder建造者模式和模板模式非常像,但是也有区别,模板模式中父类对子类中的实现进行操作,在父类之中进行一件事情的处理,但是在Builder模式之中,父类和子类都不用关心怎么处理...

青衣霓裳
28分钟前
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部