【狂神说JAVA】JVM快速入门-2

1、JVM的位置

A为java程序,jre包含jvm,建立在操作系统上,再建立在硬件体系上。

2、JVM体系结构

  • 堆中可能有垃圾,栈中不会有。因为main一进来压到最低,如果有垃圾,则代码无法结束。

  • 所以真正的垃圾在堆中,方法区属于 特殊的堆,所以也有。那所谓的JVM调优99%就是在堆中调优。

  • 图中,先是javac编译代码成为class文件,再进入类装载器classloader。运行时数据区中,堆,方法区和栈是之前学java时遇到的。

  • 图1为粗略图,图2为详细大图

3、类加载器

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

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

分类:

1、虚拟机自带的加载器

2、启动类(根)加载器

3、扩展类加载器

4、应用程序加载器

注意到上图中,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、沙箱安全机制

所谓域就类似于linux的用户root,user1,user2,每个人权限不同。

  • 组成沙箱的基本组件:其中的字节码校验器就是从语法层面校验。

以上沙箱安全机制了解即可。

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页