JVM虚拟机的运行原理,以及堆,栈,方法区的原理!

1:类加载器

主要负责从文件系统中加载class信息,加载的信息存放在一块被称为方法区的地方。

2:方法区

就是存放类信息,常量信息,常量池信息。包括字符串字面量,和数字常量信息。

3:java堆

虚拟机启动时创建的JAVA堆,他是java程序最要的工作内存区域,几乎所有对象的创建实例都在堆中,堆空间是线程共享的。

4:直接内存

java的NIO库允许java程序使用直接内存,从而提高性能,通常直接内存的运行速度会快于java堆,一般在读写频繁的时候使用。

5:java栈

每个虚拟机都有一个私有的栈,一个线程的java栈在线程创建时被创建的,java栈中保存着局部变量,方法参数,同时java方法的调用,返回值等。

6:本地方法栈

和java栈非常类似,最大的不同是本地方法栈是由本地方法调用,java虚拟机允许java直接调用本地方法。

7:GC,垃圾回收器

垃圾回收系统是java的核心,是必不可少的,java有一套自己进行垃圾处理的机制,开发人员无需收工去处理。

8:pc寄存器

是每个线程私有的空间,java虚拟机会为每个线程创建pc寄存器,在任意时刻,一个java线程总是在执行一个方法。这个方法被称为当前方法。如果当前方法不是本地方法,PC寄存器就会执行当前正在被执行的指令,如果是本地方法,则PC寄存器值就为UNDEFINED,寄存器存放如当前执行环境指针,程序计数器,操作栈指针等。

9:执行引擎

虚拟机最核心的部分,就是执行引擎,它主要负责执行虚拟机的字节码。一般先执行编译成机器码后执行。

下面重点解析下JAVA的堆,栈,方法区是如何运行的。

堆主要是解决数据存储的问题,就是我们的数据怎么放,放在哪里,栈主要是解决程序的运行问题,程序如何运行,或者如何处理数据。方法区是辅助堆栈的永久区(perm)解决堆栈信息的产生,是先决的条件,例如:我们创建一个User对象,那么User类的一些信息(类信息,静态信息都存在于方法区中)而User类被实例化后的对象,就存储于堆中,一块的内存空间。当我们需要使用User对象的引用的时候,例如 User user  = new User ();这里的user就是存放在我们的栈中。就是我们引用User对象的一个引用。

java堆中是java应用程序关系密切的内存空间,几乎我们创建的所有对象都放在Java堆中,并且java堆是完全的自动化管理的,通过我们的垃圾回收机制,垃圾的对象会自动的被清理掉。不需要去管理。根据java回收的机制不同,堆中会分为不同的结构。

堆中分为四个区域,其中S0跟S1大小区域是相等的,就是from区跟to 区,新生代就是Eden区。其中我们的新生代主要是存放一些新生的对象或者一些年龄不大的对象,老年代则是存放老年对象。什么叫新生对象?就是比如我刚创建出来或者NEW的对象,年龄不大就是根据我们GC来说,加入我们的GC回收一次,那么这个对象没有被清理的话,则会进入S1和S0区,之后每次经过一次GC,那么对象的年龄+1,当达到某个阈值的时候,就迈入老年代。

 

S0和S1的是怎么操作的呢?

这两个区域主要使用的是一套GC的复制算法,每次程序都可以使用其中的一个区域,例如:我们的S0区有U1,U2两个对象,当GC去清理的时候,发现U2还在使用,那么就将U2复制到S1区,然后清空S0区,如此的这样反复循环。直到对象达到某个点的时候将对象转入老年代。

最后总结下:我们程序的堆栈空间不是无限大的,可以在我们的开发IDE进行配置初始大小,以及最大的值,不然的话当对象创建太多的时候容易出现内存溢出outofmemoery的哦~,而且就算在边缘的情况下,你会发现程序运行的很慢,或者卡在一个点的情况下。堆空间可能不够用啦!常见的参数有-XMs;-XMm等。另行百度吧!

 

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值