`
wang7839186
  • 浏览: 40762 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

jvm学习第一天

    博客分类:
  • java
阅读更多

与c和c++不同,java的虚拟机拥有自动垃圾回收的机制,使得程序员不必去关注垃圾回收的具体过程,然而或许也正因为如此,一旦出现了java内存泄露或者内存溢出时,排查工作讲变的麻烦,所以,理解jvm还是很有意义的。

 

一、jvm运行时数据区域:分为方法区,栈(本地方法栈、虚拟机栈),程序计数器,堆。

 

程序计数器:由于cpu处理线程时采用的是轮询的方式,所以,计数器会帮助cpu完成下一个线程的调度工作,当然每个线程都有一个独立的程序计数器,以便cpu能够找到相应的线程。

 

栈:jvm中的栈分为虚拟机栈和本地方法栈,在程序运行的过程中,会产生很多局部变量,也就是很多基本类型和对象的引用。当栈的引用深度超过虚拟机允许的深度,就会抛出StackOverflowError,而当虚拟机扩展内存超出事先规定的内存时,会抛出OutOfMemoryError。

 

堆:所有线程共享的一篇内存区域,保存对象的实例,同样当扩展内存越界时会抛出OutOfMemoryError。

 

方法区:一般称为非堆,为了把它和堆区分开,主要包括运行时常量池,保存一些静态常量。

 

二、对象访问

分为两种方式,句柄和直接指针

 

句柄方式中,引用保存的是句柄池中句柄的内存地址,然后根据句柄地址,再去寻找对象实例的地址,优点是当对象实例的地址发生变化时,只需要更改句柄的地址,而引用的地址不用改变。

 

直接指针:保存对象实例的内存地址,优点是减少一次寻址过程。

 

三、垃圾收集器与内存分配策略

GC主要完成三件事情:

1、那些内存需要回收

2、什么时候回收

3、如何回收

 

我们知道,程序计数器和栈是紧紧跟随线程的生命周期的,在线程的生命周期内,栈中的栈帧也有条不紊的出栈和入栈,所以,这部分的垃圾回收变的自然和有序,基本上在类确定后,这部分的内存回收和分配都是确定的。但是堆却恰恰相反,具有一系列的不确定性,而GC关注的也是这部分内存的分配和回收。

 

在jdk1.2之后,java将引用分为四种:强引用、软引用、若引用、虚引用四种。

 

强引用是指程序中普遍存在的类似Object obj = new Object(),这样的,只要强引用存在,那么对象就永远不会被回收

 

一个对象实例被GC所回收,要经历两个阶段。在判断根路径不可达后,它会被第一次标记并且进行筛选,筛选的条件是此对象有无必要执行finalize方法,如果对象没有复写finalize方法,或者改方法已经被虚拟机调用过,那么就判定是没有必要执行的。如果有必要执行,那么对象会被放入F-Queue的队列中,而finalize方法是对象逃脱回收的最后机会。

 

package com.struts.jvm;

public class FinalizeEscapeGC {
	
	public static FinalizeEscapeGC SAVE_HOOK = null;
	
	//证明还活着
	public void isAlive(){
		System.out.println("yes,i am still alive");
	}
	
	//重生方法
	@Override
	protected void finalize() throws Throwable {
		super.finalize();
		System.out.println("finalize method executed");
		FinalizeEscapeGC.SAVE_HOOK = this;
	}
	
	public static void main(String[] args) throws Exception {
		SAVE_HOOK = new FinalizeEscapeGC();
		
		//对象第一次调用重生方法,重新获得引用,拯救自己
		SAVE_HOOK = null;
		
		gc();
		
		//但是同样的代码第二次却失效,因为finalize方法已经被调用过,它被回收了
		SAVE_HOOK = null;
		
		gc();
		
	}

	private static void gc() throws InterruptedException {
		System.gc();
		
		Thread.sleep(500);
		if(SAVE_HOOK != null){
			SAVE_HOOK.isAlive();
		}else{
			System.out.println("no,i am dead:");
		}
	}
}

//输出为:
finalize method executed
yes,i am still alive
no,i am dead

 

可见,对象的finalize方法只能被调用一次,如果面临下一次回收,那么它将不会再被调用。

分享到:
评论
1 楼 chhx 2012-12-17  

相关推荐

    学习JVM的第一天

    1.首先了解JVM(java虚拟机)、JRE和JDK之间的关系  JDK全称是Java SE Development Kit(Java开发工具),提供了编译和运行Java程序所需的各种资源和工具,包括JRE+java开发工具。  JRE全称是Java runtime environment...

    java基础第一天学习.md

    java基础、IDE,jVM、java概念。jdk描述

    小白学习Java第一天,开发环境的搭建

    一、JDK、JRE、JVM的关系 Java虚拟机,简称JVM,是运行所有Java程序的假想计算机,是Java程序的 运行环境,是Java 最具吸引力的特性之一。我们编写的Java代码,都运行在 JVM 之上。JVM虚拟机实际起到翻译作用,将源...

    Android中使用Kotlin实现一个简单的登录界面

    刚接触Kotlin的第一天,仿照QQ的登录界面,先写一个简单的登录界面,虽然笔者用的不是很熟,还在慢慢摸索,但是Kotlin是真的很简洁,笔者的实现效果如下: 登录界面代码如下: class LoginActivity

    java是什么.avi

    java学习第一天,讲解java是什么 本章学习要点 了解 Java 语言的版本及特点 了解学习 Java 的方法 掌握 JDK 的安装 掌握环境变量的配置 熟悉 Java 程序的编写、编译和运行过程 了解 Java 虚拟机的作用 熟悉 Java ...

    玩转Java虚拟机(一)

    从今天开始打卡学习JVM,第一天 本人学习过程中所整理的代码,源码地址 – 类加载 在Java代码中,类型的加载、连接与初始化过程都是在程序运行期间完成的 加载:查找并加载类的二进制数据,具体指将类的.class文件中...

    玩转Java虚拟机(九)

    打卡学习JVM,第九天 本人学习过程中所整理的代码,源码地址 JVM垃圾回收(GC)模型 垃圾判断算法 GC算法 垃圾回收器的实现和选择 – 垃圾判断算法 引用计数算法(Reference Counting) 给对象添加一个引用计数器,...

    小白的20天Java学习打卡day3

    太原理工大学机器人团队20天学习打卡day3 ...第一类:整数型 byte,short,int,long 第二类:浮点型 float,double 第三类:布尔型 boolean 第四类:字符型 char 注意:字符串不属于基本数据类型,属于引用

    Eclipse开发分布式商城系统+完整视频代码及文档

    │ 淘淘商城第一天笔记.docx │ ├─02.第二天 │ 07.商品类目选择完成.avi │ 01.课程计划.avi │ 02.展示首页.avi │ 03.分页插件01.avi │ 04.分页插件的使用方法.avi │ 05.商品列表展示.avi │ 06.商品类目...

    java餐厅系统源码-jcrete2017:在JCrete2017非会议上收集的材料

    第一天 (17.07.2017) 会议 # 时间/房间 主厅 打印机房 图书馆 烟囱 可怕的房间 隐藏房间 上网室 餐厅 在藤蔓下 1 10:15 - 11:15 React式编程 开发运营脚本 机器学习 詹金斯管道 Java EE 的未来? 2 11:30 - 12:30 ...

    张孝祥Java就业培训教程.pdf

    在刚开始的第一章就详细地讲解了Java开发环境的搭建、反编译工具的使用、JDK文档资料的查阅,Java程序的编译、运行过程。在第二章中,全面地讲解Java的基本语法知识,对基本语法的讲解也不是泛泛而谈,而是在其中...

    达内java培训目录

    第一阶段(以Tetris项目贯穿) Java语言基础 算法基础、常用数据结构、企业编程规范。 掌握常见的数据结构和实用算法;培养良好的企业级编程习惯。 Java面向对象 面向对象特性:封装、继承、多态等,面向对象程序...

    Training-Flag_Android_2015:用于对 Android 培训期间创建的 Java 项目和实验室进行版本控制的存储库

    从这一天开始的链接/资源: - 官方 Git 书籍(免费)。 - 因为不是每个人都喜欢命令行 :-P TPC : 查看 .gitignore 文件是什么。 将第一个 Android 应用程序推送到远程存储库。 13-04-2015 : 讨论 .gitignore ...

    编程新手真言......

    12.1 第一天:接到一个案子 207 12.2 第二天:需求分析 208 第13章 设计(领域分析与抽象) 210 13.1 原语设计 210 13.2 了解Yake 216 13.3 GVWL1.0开发 222 13.4 范型设计与实作 223 第14章 编码 224 14.1 原语设计...

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

     本书非常适合Java的初学者,如高校学生、求职人员作为练习、速查、学习使用,也适合Java程序员参考、查阅。 目 录 第1篇 Java语法与面向对象技术 第1章 开发环境的应用 2 1.1 Java环境 3 实例001 下载JDK开发...

    易语言程序免安装版下载

    修改BUG:超级列表框在属性“整行选择”为真时,鼠标单击第一列右面也会导致第一列中的选择框被选中或取消选中。 21. 修改BUG:Sqlite3数据库支持库中“Sqlite数据库.取错误文本()”返回的文本是UTF-8编码(应是GB...

Global site tag (gtag.js) - Google Analytics