jvm运行时数据区
博客专区 > 汪林 的博客 > 博客详情
jvm运行时数据区
汪林 发表于4年前
jvm运行时数据区
  • 发表于 4年前
  • 阅读 94
  • 收藏 5
  • 点赞 0
  • 评论 1

移动开发云端新模式探索实践 >>>   

摘要: jvm内存空间

    sun jdk遵循JVM规范,它将内存空间划分为方法区,堆,本地方法栈,pc寄存器,jvm方法栈等5个部分。

方法区

    1.方法区中主要存放加载类的信息,比如类的名称,修饰符,类中的静态变量,final类型的常量,字段信息,方法信息等。

    2.方法区是线程共享的。

    3.方法区对应内存中的Permanet Generation,又称为持久代,默认最小为16M,最大为64M,可以通过-XX:PermSize 及 --XX:MaxPermSize来指定大小。

    1.堆一般都用来存放对象的实例,比如Person p = new Person();后面的new person()这个对象实例就会在堆内存里分配空间。在32位操作系统上堆内存最大为2G,而在64位操作系统上没有限制。

    2.堆内存也是线程共享的。

    3.堆内存可以通过-Xms和-Xmx来指定,前者为初始化堆内存的大小,后者为最大堆内存的大小。默认情况下初始化堆内存-Xms为物理内存的1/64但小于1G,最大堆内存-Xmx为物理内存的的1/4但小于1G,当堆内存空闲空间小于40%时,jvm则会把堆内存增大到-Xmx配置的参数,而当堆内存空闲空间大于70%时,jvm则会把堆内存减到-Xms配置的参数,这个百分比可以通过-XX:MaxHeepFreeRatio=来指定。在现实业务场景中,为了避免堆内存频繁的调整大小,通常将-Xms和-Xmx的值设置为一样。

    4.堆内存分为新生代和旧生代,其中,新生代分为一个Eden Space区和两个大小相同的Survivor Space区,可以通过-Xmn来指定新生代的大小,大部分的新建的对象都会在新生代中分配内存,但是如果新建的对象特别大的话,则可以直接让新建的大对象在旧生代中分配内存,可以通过-XX:PretenureSizeThreshold(单位为字节)设置的参数来决定究竟都多大的对象才算是大对象,另外旧生代还存放新生代中多次垃圾回收后仍然存活的对象。

本地方法栈

    1.适用于供 native方法使用的内存空间。

    2.线程私有。

jvm方法栈

    1.jvm方法栈里面存放了很多栈帧,栈帧由局部变量数组,操作数栈,常量引用组成。当类中的一个方法从被调用到调用完毕都完成了一次压栈到弹栈的过程。

    2.线程私有。

     3.jvm方法栈空间不足的时候则会抛出StackOverflowError,sun jdk中我们可以通过-Xss来指定jvm栈的大小。

pc计数器

    1.用于记录每个线程执行到哪个地方了,比如A线程执行到某一个方法的时候,cpu切换到了B线程,一会之后又切回A线程,切回之后我要知道我上次执行到哪里了啊,这时,就可以去找pc计数器,它那里有记录。

    2.线程私有


  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 7
博文 11
码字总数 8847
评论 (1)
路小磊
赞~
×
汪林
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: