浅谈JVM(上)

一:JVM的位置所在java

 

 JVM的位置是在操做系统和java程序之间,因此JVM并非直接操做底层硬件系统的。因此插入一个话题,若是在新买的电脑上有java的环境,那应该已是被用过的,除非商家安装的java环境,可是这种概率应该不高,因此说大几率应该是被坑了,别人用过的电脑(能够在cmd中,使用命令java -verison来查看)。c++

二:JVM的内存结构安全

 

 

 

(1)首先将.java源程序编译成.class文件(二进制)网络

   (2)   而后将.class文件加载到类加载器中,这个class文件多是本地的.class文件,也多是从网络上获取过来的.class文件(实现序列化接口)数据结构

   (3)   类加载器对class文件进行加载=>链接=>初始化的操做jvm

   (4)   下面则是到了JVM的运行数据区中(堆,栈,方法区,本地方发栈以及程序计数器)spa

类加载器(ClassLoader):附一张图操作系统

 

 

1:加载:是将本地的.class文件(或者网络节点的.class文件)中的二进制读入到内存中,把它放到运行时数据区的方法中,而后再堆区建立一个Class对象,用于封装类在方法区中的数据结构。class封装了类在方法区中的结构,而且向java程序提供了类在方法区中的数据结构接口。类的加载是由加载器完成的,加载器有:启动类加载器、扩展类加载器、系统类加载器、用户自定义类加载器。这里就牵扯到了java的双亲委派机制。线程

双亲委派机制:当某个类加载器须要加载某个.class文件,他首先把这个任务委托给他的上级类加载器,递归这个操做,若是上级的类加载器没有加载,本身才会去加载这个类。code

类加载器的类别:

(1)BootstrapLoader(启动加载器)c++编写,加载java核心库 java.*,构造ExtClassLoaderAppClassLoader。因为引导类加载器涉及到虚拟机本地实现细节,开发者没法直接获取到启动类加载器的引用,因此不容许直接经过引用进行操做。

(2)ExtClassLoader (标准扩展类加载器)java编写,加载扩展库,如classpath中的jre ,javax.*或者java.ext.dir 指定位置中的类,开发者能够直接使用标准扩展类加载器。

(3)AppClassLoader(系统类加载器)java编写,加载程序所在的目录,如user.dir所在的位置的class

(4)CustomClassLoader(用户自定义类加载器)java编写,用户自定义的类加载器,可加载指定路径的class文件

 

  做用: 1:防止重复加载同一个.class,经过委托到上面问一问,加载过了,就不用在加载一遍。保证数据安全。

              2:保证核心.class不被篡改,经过委托方式,不会去篡改核心.class,即便篡改也不会去加载,即便加载也不会是同一个.class对象了。不一样的加载器加载同一个.class也不是同一个Class对象。这样保证了Class执行安全。

 

2:链接:

  • 验证:保证被加载的类的正确性;

  • 准备:给类静态变量分配内存空间,赋值一个默认的初始值;

  • 解析:把类中的符号引用转换为直接引用

3:初始化:给类的静态变量赋值正确的值。

 

运行时数据区:

(1)方法区:Method Area 方法区 是 Java虚拟机规范中定义的运行是数据区域之一,和堆(heap)同样能够在线程之间共享!

 JDK1.7以前:永久代是用于存储一些虚拟机加载类信息,常量,字符串,静态变量等等,永久代是有限制的,若是满了会报OutofMemoryError:PerGen

 JDK1.8以后:完全将永久代移除HotPot Jvm,java Heap 中或者MetaSpace(Native Heap)空间

                       元空间就是方法区在 HotSpot jvm 的实现;

                       方法区重要就是来存:类信息,常量,字符串、静态变量、符号引用、方法代码。。。。。。

                      元空间和永久代,都是对JVM规范中方法区的实现。

                      元空间和永久代最大的区别:==元空间并不在Java虚拟机中,使用的是本地内存!==

        -XX:MetasapceSize10m

(未完待续......很抱歉写做经验不太多,可能写的有些很差,后面会提升本身的表达能力!!!)

相关文章
相关标签/搜索