Java虚拟机内存模型及回收机制

本文深入探讨了Java虚拟机(JVM)的内存模型,包括堆和栈的联系、GC Root对象、垃圾回收算法,以及新生代和老年代的管理。文章还介绍了类加载器的双亲委派机制,分析了为什么使用这种机制。此外,文章详细阐述了各种垃圾收集器,如Serial、Parallel Scavenge和CMS,并讨论了如何通过调整JVM参数来优化性能。最后,文章提到了Java中的四种引用类型及其作用,并给出了内存泄漏的排查方案。
摘要由CSDN通过智能技术生成

Java的理解

java是一门纯粹的面向对象的语言。
面向对象这种程序设计模式它将现实世界中的一切事物都看作是对象,例如,一个人是一个对象,汽车、飞机、小鸟等等,都是对象;它强调从对象出发,以对象为中心用人类的思维方式来认识和思考问题。每个对象都具有各自的状态特征(也可以称为属性)及行为特征(方法),java就是通过对象之间行为的交互来解决问题的。

1.平台无关性

(1)为什么要先编译成java字节码再解析成机器码

a.准备工作:每次执行都需要各种检查。

因为编译的过程本来就是在进行编译以及检查的过程,如果直接对java代码解析成机器码,岂不是每次解析的时候都需要进行检查,何不提前检查好了,再进行解析

b.兼容性:也可以将别的语言解析成字节码

比如Clojure,Groovy, JRuby, Jython , Scala等他们最终会 通过不同的编译器(java是javac编译器)编译成 .class字节码在虚拟机进行运行

(2)JVM如何加载.class文件

java虚拟机:

a.JVM内存结构模型

JVM是内存中的虚拟机,可以理解为,JVM的存储就是内存,我们所有写的常量,变量,方法都在内存中

JVM架构:

img

ClassLoader (类加载器) : 依据特定的格式,加载class文件到内存

Runtime Data Area (运行数据区域) :JVM内存空间结构模型

Execution Engine (执行引擎) :对命令进行解析(解释器,对命令进行解析,能不能运行需要他来负责)

Native Interface (本机接口) :融合不同开发语言的原生库为java所用,使用Class.forName()方法中的forName0()方法进行其他语言的类库的调用,返回值是native

类从编译到执行的过程(java从源码到运行共有三个阶段)

img

编译器将*.java源文件编译为*.class字节码文件 Source源码阶段

ClassLoader将字节码转换为JVM中的Class<对象名>对象(实质是byte数组) Class类对象阶段

JVM利用Class<对象名>对象实例化 * 对象加载到内存 Runtime运行时阶段

ClassLoader

作用:

ClassLoader负责通过将Class文件的二进制数据流(使用io流进行读取的)装载进系统,然后交给java虚拟机进行连接,初始化操作(从系统外获取Class的二进制数据流)

种类: (Alibaba Dragonwell 是一款免费的 OpenJDK 发行版)

BootStrapClassLoader :C++编写,加载核心库java.* http://hg.openjdk.java.net/jdk8u/jdk8u/jdk==>browse==>src==>share==>native==>java.lang

ExtClassLoader :java编写,加载扩展库javax.* System.out.println(System.getProperty(“java.ext.dirs”));

AppClassLoader :java编写,加载程序所在目录 System.out.println(System.getProperty(“java.class.path”));

自定义ClassLoader

img

img

双亲委派机制:

img

1.自下向上检查类是否已经加载 自定义ClassLoader==》AppClassLoader==》ExtClassLoader ==》BootStrapClassLoader

2.自上向下尝试加载类 BootStrapClassLoader (jre/lib/rt.jar)==》ExtClassLoader(jre/lib/ext/*.jar) 》AppClassLoader(classpath目录)》自定义ClassLoader

小编总结:双亲委派机制:检查类是否加载的时候,顺序是自下而上的。如果是加载类的时候,顺序是自上而下的

有资料或文档需求的可以关注公众号发送暗号“12”即可哦

为什么要使用双亲委派机制:

1.避免多份同样字节码的加载(使用委托机制逐层去父类查找是否加载)

类的加载方式:(了解)

隐式加载:new (隐式调用类加载器将类加载带JVM)

显式加载:loadClass,forName等

loadClass和forName的区别:(了解)

Classloder.loadClass得到的class是没有链接的 JDBCUtils.class.getClassLoader() //getResourceAsStream(“druid.properties”)

Class.forName得到的class是已经初始化完成的 Class.forName(“cn.itcast.utils.JDBCUtils”)

JVM内存模型-JDK8:

1.程序计数器:

img

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值