当前位置:   article > 正文

走进JVM

走进JVM

一. jvm内存划分简介

     1.堆内存:主要存取的是对象的信息 ,线程共享。

     2.栈内存:主要存取对象引用和基本类型值。

     3.常量池:存储常量信息,例如String s1= "abc".

     4.方法区:classLoad加载的类信息,方法信息。

     5.本地方法栈:java底层一些类,方法信息。

     6.程序计数器:保证每次线程上下文切换的过程中还能回到原来的执行位置

二. 对jvm的一些思考

    1.众所周知,jvm中对象存在堆中,所谓的对象到底是哪些东西存储在jvm中?

       答:每当对象创建创建,会在堆内存开辟一块内存区,内存区中存放了对象的头信息,全局属性信息等。

     2.堆内存中分为新生代,老年代,永久代这种说法到底对不对?

      答:这种说法肯定是不对的,在堆内存只有新时代和老年代,堆内存使用新生代,老年代为了垃圾分代回收算法的实现。但是没有永久代。但是JDK1.7及以前版本是方法区的实现是基于老年代实现的,JDK1.8及JDK以后的版本是用原数据区,基于堆外内存实现方法区,不在使用永久代的方式。

     3.在jvm中,对象何时被回收?

       答:主要有两种算法。

          1.引用计数器算法

           每当有一个地方使用,则计数器加一,没当有一个地方释放,计数器减一,当计数器为零的时候则对象可以进行回收。但是存在弊端,当两个对象互相调用的时候是没有办法回收的,这就是我们常说的两个对象狼狈为奸

           2.可达性分析算法算法

           创建一个gcroot,gcroot通过引用是否能找到该对象,如果能找该对象说明该对象可达,不可回收。如果不能找到该对象说明该对象不可达,则说明该对象可以回收。其中1.虚拟机栈  2.方法区静态数据引用的对象  3.方法区常量引用的对象 4.Native方法引用的对象 可做为gcroot。

     4.什么是虚拟机栈

      答: 线程中方法执行的模型。每个方法执行时,就会在虚拟机中创建一个栈针。每个方法从调用到执行的过程,就对应着栈帧在虚拟机栈中从入栈到出栈的过程

     5.方法区何时被回收?

      答:1.xxx.class没有被引用的地方 2.所有实例对象被回收  3.class加载到方法区,需要classLoader,当classLoader被回收

     6.基本类型一定存在栈中么?

      答:在方法中声明的变量,即该变量是局部变量,每当程序调用方法时,系统都会为该方法建立一个方法栈,其所在方法中声明的变量就放在方法栈中,当方法结束系统会释放方法栈,其对应在该方法中声明的变量随着栈的销毁而结束,这就局部变量只能在方法中有效的原因;在类中声明的变量是成员变量,也叫全局变量,放在堆中的(因为全局变量不会随着某个方法执行结束而销毁)。

同样在类中声明的变量即可是基本类型的变量,也可以是引用类型的变量。

       (1)当声明的是基本类型的变量其变量名及其值放在堆内存中
              ①JDK7及之前static修饰的基本类型的变量是放在常量池中。
              ②JDK8及之后static修饰的基本类型的变量是放在放在堆内存中。因为而JDK8把常量池、
静态成员变量等迁移到了堆中。

       (2)引用类型时,其声明的变量仍然会存储一个内存地址值,该内存地址值指向所引用的对象。
引用变量名和对应的对象仍然存储在相应的堆中。

三 jvm的各个内存部分如何协作

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/593402
推荐阅读
  

闽ICP备14008679号