【JAVASE】JAVA内存模式和类加载机制,GC简单原理

先介绍一下类加载的过程:

我们编写的是源码文件java,通过jdk bin下面的javac工具,编译为class字节码文件,然后通过bin下面的java命令调用jvm解析class文件运行。

java实际运行的时候依靠的是字节码,之所以说java跨平台就是因为jvm能够跨平台,只要有jvm的地方,java都可以运行。

JVM装在Class文件的过程: 装载,准备,解析。

JVM通过类加载器完成类的装载过程,具体如图所示

1.先通过 启动类加载器,完成基础类的加载 lib下面的  rt.jar(c++编写)

2.通过拓展类加载器,完成拓展类的加载 lib下面的 ext目录下的拓展类(java编写)

3.最后才是通过应用程序加载器完成我们自己的类加载过程。

注意:该类加载器通过双亲委托机制完成。(简单说:一个类的加载显示在应用类加载器,找到上一级拓展类加载器,再继续网上找启动类加载器,如果顶级有权利加载,则进行加载,如果找不到才会往下一级继续,这样做的好处就是,防止其他人编写系统预置的核心类,保证运行安全,比如如果我们编写了相同的类String,如果不采用双亲委托机制,会破坏内置的String类加载。)

举例:

package com;

public class LoaderDemo {

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		System.out.println(LoaderDemo.class.getClassLoader().getClass()
				.getName());
		System.out.println(LoaderDemo.class.getClassLoader().getParent()
				.getClass().getName());
		System.out.println(LoaderDemo.class.getClassLoader().getParent()
				.getParent().getClass().getName());
	}

}

我通过代码获取当前类加载器和他们的上级类加载器;

我们清晰的可以看见,当前类加载器是appclassloader,父类加载器是ext,顶级因为是bootclassloader,c++编写的 我们获取不到,故抛出异常。

------------------------------------------------------------------------------------------------------

上面是类记载的过程,那么我们的内存是如何区别的呢?

JAVA内存模式模型:

Java内存主要其实是堆和非堆,细分可以分成如图的5部分。当我们的JVM把class字节码通过classloader载入内存后

JAVA stack 栈:基本数据类型和对象的引用地址。

heap 堆:实例化的对象(new)和数组对象。

method area方法区:元数据信息,常量等。

native method stack && program counter register:线程创建或者方法生成的时候生成的栈帧。

堆:细分为  新生代,老生代和持久代。

新生代:存放新生的对象。

老生代:新生代中长期没有被回收的对象,也就是说生命周期比较长的对象。

持久代:生命周期最长的区域,几乎不会被GC回收。(存放class和meta的信息。)

所谓的垃圾回收机制:其实回收的是堆空间里面的对象,jvm通过有向图的方式来确定对象是否具备回收的条件。当一个对象没有被任何对象所引用的时候,jvm的gc就准备回收。回收的时候,优先回收jvm新生代里面的对象,然户是老生代,持久代基本不回收。

GC算法:分代处理。过程如上

FullGC和GC区别:

GC:一般只回收新生代区域对象。

FullGC:回收新生代和老生代的区域。System.gc 其实是FullGC,应该少调用,尽量不去使用,由JVM来完成最好。即便System.gc  也未必马上回收,JVM内部有特性算特性算法完成。

时间: 2024-10-10 09:11:27

【JAVASE】JAVA内存模式和类加载机制,GC简单原理的相关文章

JVM内存模型与类加载机制

一. java虚拟机的内存模型如图: 补习一下jvm内存模型中的各个组成部分 堆: 我们new出来的对象全部放在堆中,他是jvm所能够动态分配的最大的一块空间 优点: 内存动态分配,生命周期不必事先告诉编译器,由JAVA的垃圾回收线程动态回收 栈: 存取的速度仅次于CPU的寄存器,但是存在栈里面的数据大小必须是提前定义的比如大家都知道int 4个字节 jvm在调用某些方法时,方法的参数,以及局部变量就存放在栈里面,(因为它们符合内存空间已知的特性) 主函数在栈的最底部 栈是有线程特性的,每个线程

Java中的异常处理机制的简单原理和应用。

异常是指java程序运行时(非编译)所发生的非正常情况或错误,与现实生活中的事件很相似,现实生活中的事件可以包含事件发生的时间.地点.人物.情节等信息,可以用一个对象来表示,Java使用面向对象的方式来处理异常,它把程序中发生的每个异常也都分别封装到一个对象来表示的,该对象中包含有异常的信息. Java对异常进行了分类,不同类型的异常分别用不同的Java类表示,所有异常的根类为java.lang.Throwable,Throwable下面又派生了两个子类:Error和Exception,Erro

java——关于异常处理机制的简单原理和应用

异常处理机制的简单原理和应用 一.Execption可以分为java标准定义的异常和程序员自定义异常2种 (1)一种是当程序违反了java语规则的时候,JAVA虚拟机就会将发生的错误表示为一个异常.这里语法规则指的是JAVA类库内置的语义检查. 例如 int i = 2 / 0 或者 String str = null;str.length(); (2)另一种情况就是JAVA允许程序员扩展这种语义检查,程序员可以创建自己的异常,并自由选择在何时用throw关键字引发异常. 例如 Exceptio

Java深入 - Java 内存分配和回收机制-转

Java的GC机制是自动进行的,和c语言有些区别需要程序员自己保证内存的使用和回收. Java的内存分配和回收也主要在Java的堆上进行的,Java的堆中存储了大量的对象实例,所以Java的堆也叫GC堆. Java在垃圾收集的过程中,主要用到了分代收集算法,我会先讲一下常用垃圾收集算法. 常用垃圾收集算法 1. 标记-清除算法 这种垃圾收集算法思路非常简单,主要是首先标记出所有需要回收的对象,然后回收所有需要回收的对象. 但是有一个明显的缺点,采用这种算法之后会发现内存块回收之后就不连续了,这就

Java魔法堂:类加载机制入门

一.前言 当在CMD/SHELL中输入 $ java Main<CR><LF> 后,Main程序就开始运行了,但在运行之前总得先把Main.class及其所依赖的类加载到JVM中吧!本篇将记录这些日子对类加载机制的学习心得,以便日后查阅.若有纰漏请大家指正,谢谢! 以下内容均基于JDK7和HotSpot VM. 二.执行java的那刻   大家都知道通过java命令来启动JVM和运行应用程序,但实际的流程又是如何的呢? 1. 首先根据java后的运行模式配置项或<JAVA_H

深入理解Java虚拟机笔记——虚拟机类加载机制

[TOC] 概述 虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制. 动态加载和动态连接 在Java语言里面,类型的加载.连接和初始化过程都是在程序运行期间完成的. 类加载的时机 类的生命周期 类从被加载到虚拟机内存中开始,到卸载出内存位置,它的整个生命周期包括: 加载(Loading).验证(Verification).准备(Preparing).解析(Resolution).初始化(Ini

java虚拟机之虚拟机类加载机制

此处主要需要知道什么是java虚拟机?java虚拟机如何进行类加载的? java语言本身是编译型和解释型的语言,先对本地的java文件进行编译,编译后会在本地生成一个class文件,而这个生成的class文件就是java虚拟机需要加载的类 所谓的java虚拟机就是JVM(java virtual machine),对应不同的操作系统有不同的版本,如有window版本,Linux版本等,正是因为JVM,java语言才实现了跨平台. 而编译和解释分开,可以实现一次编译,处处运行,只需要加载class

Java内存模式以及回收模式

1.Java内存模型 Java虚拟机在执行程序时把它管理的内存分为若干数据区域,这些数据区域分布情况如下图所示: 程序计数器:一块较小内存区域,指向当前所执行的字节码.如果线程正在执行一个Java方法,这个计数器记录正在执行的虚拟机字节码指令的地址,如果执行的是Native方法,这个计算器值为空. Java虚拟机栈:线程私有的,其生命周期和线程一致,每个方法执行时都会创建一个栈帧用于存储局部变量表.操作数栈.动态链接.方法出口等信息. 本地方法栈:与虚拟机栈功能类似,只不过虚拟机栈为虚拟机执行J

Java内存模式

Java内存模型即Java Memory Model,简称JMM.JMM定义了Java 虚拟机(JVM)在计算机内存(RAM)中的工作方式. Java内存分配主要包括以下几个区域: 寄存器:我们在程序中无法控制 栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中 堆:存放用new产生的数据 静态域:存放在对象中用static定义的静态成员 常量池:存放常量 非RAM(随机存取存储器)存储:硬盘等永久存储空间 Java内存分配中的栈 在函数中定义的一些基本类型的变量数据和对