JVM探究【狂神篇-快速入门】,关于SQL书写建议-&索引优化的总结

================================================================

作用: 加载class文件,new student()时,引用(地址)存在栈中,对象存在堆中。

从类到对象用实例化new,从对象到类就是反射getClass

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

分类:

1、虚拟机自带的加载器

2、启动类(根)加载器

3、扩展类加载器 (ExtClassLoader)

4、应用程序加载器 (AppClassLoader)

在这里插入图片描述

在这里插入图片描述

注意到上图中,classloader类加载器的打印结果和父类的classloader结果不同,再往上找父类就找不到了null。打开java软件的环境:environment/jdk8/jre/lib下有各种jar压缩包,jre是运行时环境。lib里面都存放着java运行的文件。

其中rt.jar文件就是根加载器中的一些东西,所以null。而lib下还有ext文件夹扩展类加载器,里面还有很多jar,就是上图中extclassloader。应用程序加载器就是自己定义的包。

而大公司甚至会修改根加载器,解压rt.jar,可以将自己写的类加进去,可以更改其环境。其实为保证安全,一般都写进ext中,尽量不要动rt根加载器–>双亲委派机制

4、双亲委派机制

==================================================================

当前APP(java文件)中涉及到的类,先到最根部root加载器中找,如果找到以root中为准(即使app中的和root中的类同名同形参),如果root中找不到再到扩展类加载器ext中找,如果还找不到再回到app中看自己定义的。

即地方和中央政策冲突时,以中央为准

在这里插入图片描述

图中,package写的是java.lang(其实事实没有多少人这么写,都是com.atguigu…)这样会冲突root,根据双亲委派机制,会从root开始找,发现root下有string类,所以此代码运行main时也是先用的root下的string类,而不是这里定义的return hello。

双亲委派机制目的是为了安全,防止程序员代码瞎写。

所以流程是:

在这里插入图片描述

其中之前出现的null是因为找的是jvm中的,是c++写的,钓不到。而上述的内存管理由jvm完成。

关于c++写的jvm,比如下图,在主函数中写了thread.start()。查看start方法的源码如下

在这里插入图片描述

注意到start0这里,什么都没写,其实是深入到jvm内部,调用c++底层去了。线程级别用java处理不了了。java只能调jvm,操作系统的东西java调不了,只能用接口调用本地方法,本地方法才用的native

5、沙箱安全机制

==================================================================

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

6、Native关键字

=====================================================================

方法前带了native关键字的,说明java作用范围达不到了。回去调用底层C语言的库。

  • 本地方法接口 JNI,用于ext拓展java功能。在内存区域专门开辟了一块标记区域,native method stack本地方法栈,登记native。会进入本地方法栈,调用本地方法的接口 (JNI接口)。JNI的作用:扩展Java的使用,融合不同的编程语言为java所用。最初是想融合c、c++。因为java诞生的时候,C、C++横行,想要立足必须要调用C,C++的程序。

在这里插入图片描述

  • 本地方法栈 Native Method Stack,在本地方法栈中登记native方法,在execution engine执行引擎执行的时候加载native libraries本地库。

7、PC寄存器

=================================================================

在这里插入图片描述

8、方法区

===============================================================

在这里插入图片描述

  • 静态变量:static

  • 常量:final

  • 类信息:class (构造方法、接口定义)

  • 运行时常量池

9、栈

=============================================================

先进后出

main函数先开始后结束。main先压入栈底,先执行,等所有其他函数 都执行完毕,在最后出栈。

栈中存放内容:

  • 8种数据类型

  • 对象引用

  • 实例方法

在这里插入图片描述

10、3种JVM

==================================================================

  • HotSpot

sun公司的hotspot火锅是我们常用的

Java HotSpot™ 64-Bit Server VM (build 25.181-b13, mixed mode)

  • JRockit

Oracle JRockit (原来的 Bea JRockit)电脑软件,系列产品是一个全面的Java运行时解决方案组合

  • J9

J9 是一个IBM推出的Java虚拟机和类库,J9在IBM的从移动设备到企业解决方案中广泛的被使用

11、堆

==============================================================

heap,一个jvm只有一个堆内存。堆内存的大小可以调节的。

类加载器读取了类文件后,一般会把什么放到堆中呢?类,方法,常量,变量,保存所有引用类型的真实对象。

堆内存中还要细分三个区域:

  • 新生区(伊甸园区)young/new

  • 养老区 old

  • 永久区 perm

在这里插入图片描述

其中,好多次没被垃圾回收GC-garbage collect掉,就进入幸存0,1;过一段时间,还没被回收掉就进入养老区。垃圾回收有轻量级的GC,还有当养老区都快满的时候,重量级的GC

GC垃圾回收主要在伊甸园区和养老区。

内存满了即OOM,out of memory堆内存不够,说明程序严重,堆都爆了。

JDK8以后,永久存储区就叫“元空间”了

12、新生区

================================================================

类:诞生和成长的地方,甚至死亡。

分为伊甸园区幸存者区(0区和1区),所有的对象都是在伊甸园区new出来的。

假设伊甸园区大小是10个,等到伊甸园区满的时候,会触发轻量GC,删除了9个,幸存了1个进入幸存者0区。那么此时伊甸园区又有10个空位置了。

这里注意幸存者0区和幸存者1区是来回交换的,不是不变的。

等到幸存者0,1区都满了,触发重GC,留下来的存到养老区。

真理:经过研究,**99%**对象都在伊甸园区就结束了,很少看到OOM报错。(可以新建一个字符串,一直往上加字符,加到爆OOM)

13、永久区

================================================================

这个区域是常驻内存的。用来存放JDK自身携带的Class对象。Interface元数据,存储的是Java运行时的一些环境或类信息。这个区域不存在垃圾回收!关闭JVM虚拟机就会释放这个区域的内存

如果一个启动类,加载了大量的第三方jar包

例如:Tomcat部署了太多的应用,大量动态生成的反射类,不断的被加载。直到内存满,就会出现OOM(Out of Memory)

在这里插入图片描述

在这里插入图片描述

方法区是共享的。伊甸园区的各个对象调用方法区的方法。

上面这个图是存在于堆区的。而元空间和方法区其实不是存在于堆中的,所以又叫非堆

实测

在这里插入图片描述

默认情况下,最大将近2G,电脑8G,差不多1/4。而初始化内存123M,差不多是8G的1/64

设置虚拟机的内存大小

-Xms1024m -Xmx1024m -XX:+PrintGCDetails

  • -Xms1024m:初始化内存

  • -Xmx1024m:最大内存

  • -XX:+PrintGCDetails:打印结果

在这里插入图片描述

在这里插入图片描述

OOM演示

在这里插入图片描述

在这里插入图片描述

GC一直在清理内存,后来又有了重GC,再轻GC,再重GC。

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
img

最后

看完上述知识点如果你深感Java基础不够扎实,或者刷题刷的不够、知识不全面

小编专门为你量身定制了一套<Java一线大厂高岗面试题解析合集:JAVA基础-中级-高级面试+SSM框架+分布式+性能调优+微服务+并发编程+网络+设计模式+数据结构与算法>

image

针对知识面不够,也莫慌!还有一整套的<Java核心进阶手册>,可以瞬间查漏补缺

image

全都是一丢一丢的收集整理纯手打出来的

更有纯手绘的各大知识体系大纲,可供梳理:Java筑基、MySQL、Redis、并发编程、Spring、分布式高性能架构知识、微服务架构知识、开源框架知识点等等的xmind手绘图~

image

image

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
img

6K22I-1712740704407)]

针对知识面不够,也莫慌!还有一整套的<Java核心进阶手册>,可以瞬间查漏补缺

[外链图片转存中…(img-L4jr901R-1712740704407)]

全都是一丢一丢的收集整理纯手打出来的

更有纯手绘的各大知识体系大纲,可供梳理:Java筑基、MySQL、Redis、并发编程、Spring、分布式高性能架构知识、微服务架构知识、开源框架知识点等等的xmind手绘图~

[外链图片转存中…(img-prJobKSM-1712740704407)]

[外链图片转存中…(img-VSiLGxyi-1712740704408)]

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-3DEXWOt6-1712740704408)]

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值