zoukankan      html  css  js  c++  java
  • jvm

    内存模型

    《深入理解java虚拟机》

    包括新生代和老年代,不包括元数据区

    在Minor GC时会将新生代中还存活着的对象复制进一个Survivor中,然后对Eden和另一个Survivor进行清理。所以,平常可用的新生代大小为Eden的大小+一个Survivor的大小 S0=S1

    分配担保机制:当Minor GC时,新生代存活的对象大于Survivor的大小时,这时一个Survivor装不下它们,那么它们就会直接进入老年代

    new大对象 ?

    GC经验值:

    Minor GC 执行快 (50 ms内). 
    Minor GC 执行不频繁 (大概10s 执行一次). 
    Full GC 执行快 (1 second内). 
    Full GC 执行不频繁 (10 minutes 一次).

    非堆==方法区

      只包含Metaspace/Perm

    存放类的方法和名称等 静态数据

    非堆也会出发GC (哪种GC?)

    设置非堆的大小

    • -XX:MinMetaspaceFreeRatio 扩大空间的最小比率,当GC后,内存占用超过这一比率,就会扩大空间
    • -XX:MaxMetaspaceFreeRatio 缩小空间的最小比率,当GC后,内存占用低于这一比率,就会缩小空间

    直接内存区

    非堆的一部分?

    netty应用, MaxDirectMemorySize可能较大

    虚拟机栈

    jvm以栈帧为单位保存线程的运行状态。每当启动一个新线程时 java虚拟机都会为它分配一个java栈。

    虚拟机只会对java栈执行两种操作:以栈帧为单位的压栈或者出栈。也就是说个数由线程的上线决定。
    还有就是栈帧由三部分组成的,局部变量区,操作数栈和帧数据区。 局部变量区和操作数栈要视对应的方法而定,它们是按照字长计算的。

    栈深度与栈帧大小(变量多少, 方法的长度)有关, 可以在启动时使用Xss设置栈帧大小, 越小时栈深度越大 stackOverflowException出现的概率越小

    线程引用多个栈帧,栈帧中的操作数区引用堆中的对象

    其它总结:

    常见的是老年代比新生代大, 但是某些应用场景新生代可能比老年代大

    非堆也可能比堆大的多,  一个反面例子是metaspace没有限制

    直接内存看应用场景:如果是做文件服务器, 视频流.... , 这块可以设置大些

  • 相关阅读:
    ubuntu 安装QT 5.0出现错误:Failed to load platform plugin "xcb".
    Ubuntu手动编译GCC
    C++面试题集锦(一)
    C++排序系列(一) 插入排序之折半插入排序
    关于内存对齐的面试题
    C++中的static_cast, dynamic_cast和reinterpret_cast
    C++排序系列(二) 交换排序之简单排序
    Cannot open include file: 'iphlpapi.h': No such file or directory(最终解决方法)
    C++排序系列(一) 插入排序之直接插入排序
    ubuntu aptget update时出现W: GPG 错误
  • 原文地址:https://www.cnblogs.com/yszzu/p/9246340.html
Copyright © 2011-2022 走看看