与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方法只能被调用一次,如果面临下一次回收,那么它将不会再被调用。
分享到:
相关推荐
学习JVM的第一天,我们首先要理解JVM(Java Virtual Machine)与JRE(Java Runtime Environment)和JDK(Java Standard Edition Development Kit)的关系。JVM是执行Java程序的核心虚拟机,负责解释和执行字节码。...
在《大神带你学Java(第1天)》的文件中,可能会详细讲解如何使用各种工具如JConsole、VisualVM或JProfiler来监控和诊断JVM状态,包括CPU使用率、内存分配、线程状态等。通过这些工具,我们可以定位性能瓶颈,比如...
### JAVA开发学习第一天知识点梳理 #### 一、计算机基本组成及其用途 - **计算机定义**:计算机是一种能够根据预设的程序自动高速处理数据的电子设备。它由硬件和软件两部分组成。 - **硬件**包括中央处理器(CPU)...
Java基础是每一个Java开发者必须掌握的核心知识,而JVM(Java虚拟机)作为Java程序运行的平台,它的理解和使用对于优化程序性能、排查问题至关重要。本篇内容将深入探讨Java基础中的JVM初步使用,帮助你更好地理解...
**JAVA学习资料 第一天 入门** 在编程世界中,Java是一种广泛应用的开发语言,以其“一次编写,到处运行”的特性赢得了全球开发者的青睐。作为初学者,"Hello World"程序是入门的第一步,它简单易懂,帮助我们了解...
通过学习"Java基础第25天-06.JVM结构1"的课程,你将能够更好地理解Java程序的运行机制,为编写高效、稳定的代码打下坚实的基础。这个视频资源可能包含详细的讲解和示例,帮助你深入掌握这些概念,并提升你的Java开发...
### Java基础学习知识点第一天 #### 一、理解JVM、JRE与JDK的作用及其相互关系 1. **Java虚拟机(JVM)**:是Java程序的运行环境,它负责将Java字节码转换为特定平台的机器语言进行执行。JVM提供了一套独立于硬件的...
Java的核心理念是“一次编写,到处运行”,这意味着Java程序可以在任何支持Java虚拟机(JVM)的操作系统上运行。自1995年发布JDK1.0以来,Java经历了三个发展阶段,包括完善期、平稳期和发展期。Oracle在2010年收购...
学习Java的第一步是主动学习,这包括三个关键环节:讨论、实践和教授他人。通过参与讨论,可以理解和解决遇到的问题,同时也能从他人的经验中学习。实践则是巩固理论知识的最佳途径,通过编写和运行代码来加深理解。...
在Java基础学习的第二天,主要涵盖了以下几个重要知识点...通过上述内容的学习,可以看出Java基础学习第二天的内容是非常全面和基础的,涵盖了编程语言的多个核心概念和实践技巧,为后续深入学习Java打下了坚实的基础。
在Java学习的第一天,我们接触了基础的Linux操作系统知识和Java编程语言的基本概念。首先,Linux文件系统是以目录的形式呈现,不同于Windows系统的磁盘形式。Linux有一个单一的根目录`/`,并且U盘在Linux中映射为...
在学习Java的第一天,入门者应该首先了解Java的基本概念。Java的开发包括JDK(Java Development Kit,Java开发工具包)、JRE(Java Runtime Environment,Java运行环境)和JVM(Java Virtual Machine,Java虚拟机)...
Java的语法虽然与C、C++相似,但它的核心理念在于提供了一个跨平台的解决方案,通过Java虚拟机(JVM)实现“一次编写,到处运行”。Java的版本演变历经多个阶段,从最初的JDK1.0到JDK1.7,每个版本都有其特定的改进...
Java学习第二天笔记 本笔记主要讲解Java的概述、环境搭建、语言特点、执行机制、设计理念、开发工具包、运行环境、虚拟机等知识点。 一、Java概述 Java是一种面向对象的程序设计语言,由Sun Microsystems于1995年...
在“java基础的一些代码2023成都第一天”的学习资源中,我们主要关注Java编程语言的基础概念和常用语法。Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems(现为Oracle公司)于1995年发布。它以其“一次...
### JavaSE第一天笔记知识点概述 #### 一、软件开发概览 **1.1 什么是软件** - **定义**: 软件是一种独立运行的产品,它通过特定的语法、语句和结构组合来满足用户的特定需求。 - **分类**: - **系统软件**: 如...
总结来说,学习Java的第一步是搭建好开发环境,这涉及到理解JVM、JRE和JDK的区别,并成功安装JDK。之后,你就可以开始你的Java编程之旅,编写出属于自己的程序。在学习过程中,不断地实践和解决问题是提升技能的关键...
第一天的学习内容至关重要,它通常会涵盖Java语言的基础概念,为后续深入学习打下坚实的基础。 首先,Java语言的特点包括跨平台性(Write Once, Run Anywhere,简称WORA),这意味着编写好的Java代码可以在任何支持...
### Python基础知识概述 ...以上是对Python基础知识—第一天学习内容的详细总结,涵盖了Python的基本概念、特点、应用领域以及基本的运行方式和变量管理等内容。这对于初学者来说是非常重要的入门知识。