前言

根据狂神说的JVM快速入门做了以下笔记,讲的很好的一个博主,给小伙伴们附上视频链接狂神说JVM快速入门
    接下来我按照他所讲的内容给大家记录一些重点!

一、JVM体系结构

.java经由javac变为class字节码文件,再通过类加载器加载.对于类加载器我根据南淮北安博主的文章进行了总结.

1.类加载器
    我们都知道java程序写好以后是以.java(文本文件)的文件存在磁盘上,然后,我们通过(bin/javac.exe)编译命令把.java文件编译成.class文件(字节码文件),并存在磁盘上。但是程序要运行,首先一定要把.class文件加载到JVM内存中才能使用的,我们所讲的classLoader,就是负责把磁盘上的.class文件加载到JVM内存中.

2.ClassLoader 层次结构
     类加载器有三种:
(1)根类加载器(null)
它是由本地代码(c/c++)实现的,你根本拿不到他的引用,但是他实际存在,并且加载一些重要的类,它加载(%JAVA_HOME%\jre\lib),如rt.jar(runtime)、i18n.jar等,这些是Java的核心类。
(2)平台类加载器(PlatformClassLoader)(jdk1.8之后的版本,之前的称为扩展类加载器 ExtClassLoader)
虽说能拿到,但是我们在实践中很少用到它,它主要加载扩展目录下的jar包, %JAVA_HOME%\lib\ext
(3)应用类加载器(appClassLoader)
它主要加载我们应用程序中的类,如Test,或者用到的第三方包,如jdbc驱动包等。这里的父类加载器与类中继承概念要区分,它们在class定义上是没有父子关系的。

3.Class 加载时调用类加载器的顺序
     当一个类要被加载时,有一个启动类加载器和实际类加载器的概念,这个概念请看如下分析:
如上面的Test.class要进行加载时,它将会启动应用类加载器进行加载Test类,但是这个应用类加载器不会真正去加载它,而是会调用看是否有父加载器,结果有,是扩展类加载器,扩展类加载器也不会直接去加载,它看自己是否有父加载器没,结果它还是有的,是根类加载器。
    所以这个时候根类加载器就去加载这个类,可是在%JAVA_HOME%\jre\lib下,它找不到dir_b.Test这个类,所以他告诉他的子类加载器,我找不到,你去加载吧,子类扩展类加载器去%JAVA_HOME%\lib\ext去找,也找不着,它告诉它的子类加载器 AppClassLoader,我找不到这个类,你去加载吧,结果AppClassLoader找到了,就加到内存中,并生成Class对象。这也是 Java 中著名的委托加载机制.

4.流程图

红框区域不会有垃圾回收,所谓的调优99%都是在堆与方法区(特殊的堆)。

二、对象实例化过程

Student stu; //在栈内存开辟空间给引用变量stu
stu = new Student(); //new Student()在堆内存里面开辟了空间给Student类的对象,Student()随即调用Student类中的构造函数,把Student类对象在堆内存的地址给引用变量stu
  • 1
  • 2

类经过ClassLoader加载,再实例化出具体实例,在栈内存开辟空间给引用变量stu,new Student()在堆内存里面开辟了空间给Student类的对象,Student()随即调用Student类中的构造函数,把Student类对象在堆内存的地址给引用变量stu

三、对象实例化实质

通过反射(对应图中getClass)介绍了同一类的Class模板都是一样的,hashcode一样。
new实例化(对应图中nuw)之后才是具体的,hashcode不同

    类加载器要进行加载时,它将会启动应用类加载器进行加载Test类,但是这个应用类加载器不会真正去加载它,而是会调用看是否有父加载器,结果有,是扩展类加载器,扩展类加载器也不会直接去加载,它看自己是否有父加载器没,结果它还是有的,是根类加载器。
    以下代码探究了三种加载器

四、双亲委派机制

通过重写toString,介绍了双亲委派机制

运行不成功,因为类加载时会一直向上委托,在根加载器中找到了toString并运行,发现没有主函数

四、Native本地方法

介绍了native本地方法:用于调用底层用C写的库

五、虚拟机栈

栈细分成栈帧
    

六、堆


    堆分成了eden、s0、s1、tentired.

    左边为JDK8以后永久存储区变为元空间(整体如此,还是有些细微区别)

七、结合栈和堆谈谈实例化过程

往栈创建引用变量,在堆中创建实例,实例指向方法区中的常量池(例如实例有name属性,name=“Apollo”,这个“Apollo”字符串就在常量池中,1.7开始常量池从方法区中移了出来,在堆中开辟区域存放运行时的常量池。)

未完待续-----

原文章:

最新文章

  1. CSS3 笔记五(Buttons)
  2. (转)awk实例练习(二)
  3. spring定时器设置(转自:http://my.oschina.net/LvSantorini/blog/520049)
  4. [python实用代码片段]python获取当前时间的前一天,前一周,前一个月
  5. Android SQLite (四 ) 全面详解(二)
  6. Eclipse+Maven创建webapp项目<一><二><三>
  7. C#_mvc_ajax_return data
  8. 浅谈HtmlUnit的使用
  9. Python中__init__方法介绍
  10. C语言博客作业--字符数组-陈张鑫
  11. Python 基础知识(持续更新中)
  12. MySql: Year, Quarter, Month, Day, Hour statistics
  13. Leetcode 题解 First Missing Positive
  14. Python基本数据类型以及字符串
  15. Android Studio发布Release版本之坑--Unknown host 'd29vzk4ow07wi7.cloudfront.net'
  16. SOA 设计的 9 大原则
  17. WebViewJavascriptBridge源代码分析
  18. OC MRC之循环引用问题(代码分析)
  19. HashTable vs HashMap(三)
  20. Swift-'as?','as'用法

热门文章

  1. hdu1542 线段树扫描线求矩形面积的并
  2. 攻防世界Web刷题记录(进阶区)
  3. 报错com.github.pagehelper.PageHelper cannot be cast to com.github.pagehelper.Dialect
  4. 【opencv】VideoCapture打不开本地视频文件或者网络IP摄像头
  5. 【Web前端HTML5&CSS3】03-字符实体与语义标签
  6. QFNU 10-30 training
  7. 关于有符号数和无符号数的转换 - C/C++
  8. .Net Core with 微服务 - 架构图
  9. [操作系统知识储备,进程相关概念,开启进程的两种方式、 进程Queue介绍]
  10. [bug] Flask:jinja2.exceptions.UndefinedError: 'None' has no attribute 'id'