JVM结构

1.1jvm,jre,jdk是什么,它们之间有什么联系?
JVM(Java Virtual Machine(Java虚拟机)),是java实现跨平台的最核心的部分,java的程序经过编译之后生成.class文件,是.class文件执行的环境,但是只有jvm并不能直接执行,需要调用jre的类库,才能执行。

 

JRE(Java Runtime Environment(Java运行环境)),包含JVM标准实现及Java核心类库,它仅是一个运行环境,并不是开发环境。

JDK(Java Development Kit(Java开发工具包)),是java语言开发的工具包,在JDK的安装目录下有一个JRE目录,里面有两个文件夹bin和lib,在这里可以认为bin里的就是JVM,lib中则是JVM工作所需要的类库,而JVM和 lib合起来就称为JRE。

所以,新手们不用下完JDK之后又下载JRE了,可以在安装 jdk 的时候可以选择不安装 jre 而直接使用 jdk 下的 jre 运行我们的 Java 程序,如果不考虑开发的话,只下载jre就行了。watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAVFlYUEM=,size_20,color_FFFFFF,t_70,g_se,x_16

1.2JVM的体系结构watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAVFlYUEM=,size_20,color_FFFFFF,t_70,g_se,x_16

JVM的结构如图所示,而我们所说的jvm调优则是对方法区和堆进行调优。

类加载器分为四级:

  1. 虚拟机自带的加载器
  2. 启动类加载器
  3. 拓展类加载器
  4. 应用程序加载器

 

类加载器接收到类加载的请求,会从将这个请求从应用程序加载器一直向上委托直到启动类加载器,如果启动类还没有找到就会报ClassNotFound这个异常。

 

可以通过Getclassloader()方法获取类加载器

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAVFlYUEM=,size_20,color_FFFFFF,t_70,g_se,x_16

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAVFlYUEM=,size_20,color_FFFFFF,t_70,g_se,x_16

 凡是带了native关键字的说名java调用不到了,需要调用本地方法栈的C语言写的代码,如Thread类中的start0()方法。watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAVFlYUEM=,size_20,color_FFFFFF,t_70,g_se,x_16

 

程序计数器:每一个线程都有一个程序计数器,是线程私有的,相当于一个指针,指向方法区中的方法字节码,在执行引擎读取下一个执行的指令。但其占用的内存非常小,可以忽略不计。

 

方法区:构造函数,接口等都被在此处定义,被所有线程所共享。

静态变量,常量,构造函数,接口,运行时的常量池都被存储在方法区中。实例变量被存储在堆内存中。

 

栈:先进后出,后进先出

队列:先进先出

栈存储的对象为:8种数据类型,对象引用,实例方法。

如代码所示,先将main方法入栈,在将test方法入栈,后调用test方法后将test方法出栈,在执行main方法,将main方法出栈。所以说,线程周期和生命周期是相同的,不需要进行GC处理。如果栈堆满了会报StackOverFlowError。watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAVFlYUEM=,size_20,color_FFFFFF,t_70,g_se,x_16

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAVFlYUEM=,size_20,color_FFFFFF,t_70,g_se,x_16 

 

类加载器加载class文件后,会把类,方法,变量,常量,引用类型的真实变量存储在堆内存中。

堆又分为三个区域

新生区(young):类诞生、成长和死亡的地方。

新生区又分为伊甸园区和幸存区(0区和1区),所有的对象都是在伊甸园区new出来的。当伊甸园区内存满看之后,就会执行轻GC进行垃圾回收,如果对象还存在引用,幸存下来后,就自动进入幸存0区。幸存区存货下来的就进入老年区,老年区内存满了就会执行重GC进行垃圾回收。

老年区(old)

 

永久区(perm)(元空间:JDK8之后)

 

用于存储类的信息、常量池、方法数据、方法代码等

 

元空间与永久代之间最大的区别在于:元空间并不在虚拟机中,而是使用本地内存

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAVFlYUEM=,size_20,color_FFFFFF,t_70,g_se,x_16

 

 

 watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAVFlYUEM=,size_20,color_FFFFFF,t_70,g_se,x_16

 默认情况下总内存为电脑内存的1/4,初始化的内存为是电脑总内存的1/64watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAVFlYUEM=,size_20,color_FFFFFF,t_70,g_se,x_16

 可以在IDEA中的配置下调节参数如图将其最大内存和总内存都设置为1024mwatermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAVFlYUEM=,size_20,color_FFFFFF,t_70,g_se,x_16

 

 具体调优分析可以下载Jprofiler进行具体分析。

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值