• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

子把瓢总

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

java虚拟机

1、先从虚拟机说起,什么是虚拟机呢?就是个虚拟的计算机,就是个假冒的计算机,就是个模拟的计算机,就是个没有真正硬件的计算机。是计算机,那么它就要有计算机的结构, 比如,cpu,指令系统等。那么jvm,也就是java虚拟机由哪几部分构成的呢?

 

 

 

 

 

 

好了,网上找来的东西也差不多都是这个样子的,

虚拟机大概分为两部分,一部分是所有线程共享的,一部分是单一线程独享的。

对应所有线程共享的这一部分,包括两小块的内容,一个是方法区,一个是堆

对于单一线程独享的这一部分,包括三个小块的内容,一个java栈,一个本地方法栈,还有个程序计数器。

对于所有线程共享的东西是怎么来的呢,是类加载器加载进来的?那么类加载的原理是什么?

 

2、先说说共享的方法区,这里边有什么东西呢?被装载的类信息,那么一个类有哪些信息会被装载到这个方法区呢,类中的静态变量,方法区如果只是存储类的信息,那么它的大小是不是在在类加载完以后就不会变了呢?实际上还是会变的,我们还可以定义自己的类加载器,加载我们需要的类,那么方法区就会变大;能变大那是不是也能变小呢,垃圾回收器也会光顾它进行回收。那么既然它可以变大,也可以变小,总要有个参考值吧,它的标准是什么,或者说它的初始值是多少?还有当它变大或者变小的时候,方法区是连续的吗?

     先弄清楚上边的问题,类的哪些信息被加载到方法区了,一个类的完整类名,什么叫完整类名,就是包含包名的;这个类的直接父类的完整类有效名,那么什么情况下是没有父类的完整有效名呢,接口和Ojbect;还有什么呢?类的修饰符,也就是public,abstract,final等?还有什么呢,这个类的直接接口有序列表?为什么是有序的呢?

    除了上边的信息,还有哪些小信息被加载到方法区了,类的常量池,这个是个什么东西,指得是什么?域信息,也就是属性信息,属性一般会有什么?get和set方法,当然就是它对应的方法信息了,除了常量以外的所有静态变量,这个是什么,和常量有什么区别?

     a、先说说类的常量池,什么是常量池呢,就是这个类用到的常量的一个有序集合?包括哪些内容呢?有实际的常量,什么是实际的常量,比如string,integer,float,point常量等;还有符号引用,什么是符号引用呢?对类、域、和方法的引用,这个不是很理解。

    b、什么是域信息呢?域信息和声明顺序有什么关系?域信息有哪些?域名,域类型,域修饰符,

        修饰符包括哪些呢?public,private,protected,static,final,volatile,transient

        什么是volatile呢?这个貌似用在多线程,我是没用过

        什么是transient呢?就是序列化的时候忽略掉它!那么什么是序列化呢?

    c、方法信息有哪些?异常表,参数列表,方法名,返回值,方法的修饰符,还有最为关键的,方法的字节码,

       什么叫操作数栈和方法栈帧的局部变量大小?

    d、静态变量,什么是静态变量呢?静态变量也叫做类常量?那什么是常量呢?就是被定义成final的量就是常量。

      这句话什么意思?non-final类变量被存储在声明它的类信息内,而final类被存储在所有使用它的类信息内,为什么是这    样     的?

     e、对类加载器的引用,也要存在方法区,这个主要用来标识这个类是用启动加载器加载的,还是用户加载器加载的。这个到底有什么用的?

     f、对Class类的引用,jvm为每个加载的类型都创建一个Class类型的实例。这个实例记录了哪些信息呢?什么叫做类引用?

当前命名空间是如何区分的呢?

     比如,Integer i = new Integer(1);

     i.getClass()可以得到对应的类引用,通过对应的类引用,你可以获得相应的类在方法区中的类型信息,这些类型信息有哪些呢? getName(),getSuperClass(),isInterface(),getInterface(),getClassLoader()

3、再来看看Heap

堆里边放了哪些信息呢?所有类的实例或者数组,对于一个jvm实例,只有一个堆,这是个所有线程共享的。类的实例又包含了哪些信息呢?一个是实例变量的引用,一个是指向方法区类信息的指针。堆的结构是什么样子的?堆内存公分为3个区域,哪三个区域呢?永久存储区域(Permanent Space),新生区(Yong Generation Space),老生区(Tenure Generation Space)。

永久存储区是方法区吗?

什么是新生区?就是类的诞生,成长,消亡的区域,一个类在这里产生,应用,最后被垃圾回收器收集,结束生命。新生区又分为哪些部分?新生区共有两部分:一个是eden区(伊甸区),一个是幸存者区(Survivor pace),所有的类都是在伊甸区被new出来,。幸存者区共有两个0区(Survivor 0 space)和1区(Survivor 1 space)。

程序开始后,不停的在伊甸园区new对象,当伊甸园的空间满的时候,就会进行垃圾回收,没有被回收的对象就会被移动到0区,如果0区满了,再进行垃圾回收,移动到1区,1区也满了,再移动到Tenure Generation Space区域。

 

 

对于我们使用的jvm,该如何配置堆信息呢?heap的初始大小是多少呢?-Xms 默认为物理内存的1/64

heap在逐渐增大过程中,最大值是多少呢?-Xmx 默认为物理内存的1/4,那么什么时候会扩大堆内存呢?有个参数-XX:MinHeapFreeRatio=指定(40%),什么时候垃圾回收后会减少堆内存呢?-XX:MaxHeapFreeRadio=指定(70%),服务器一般设置这两个参数-Xms和-Xmx一样,以避免每次gc后重新调整堆的大小

XMS Extended Memory Standard

 

4、再来看看Stack(栈)

什么是栈,stack是一种后进先出的数据结构,先进后出指的也是他,所以当前执行的方法总是位于栈顶,怎么执行方法的呢?当执行一个方法的时候,会为这个方法创建一个新的帧并压栈,当方法执行完返回的时候,对应的帧将被删除了,也就是出栈。

5、再看看本地方法栈

如果是调用的c语言什么的,才会有这个吧?

6、Program Count Register是干什么事情的呢?

首先,它记录的是非本地代码,他指向当前指令的位置,也是个变量,在每次执行完指令都都会递增,来保存下一个指令的位置,

如果该方法是java方法,那PC寄存器保存JVM正在执行的字节码指令的地址

如果该方法是native,那PC寄存器的值是undefined。

posted on 2014-12-16 22:45  子把瓢总  阅读(246)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3