运维人所应该知晓的java虚拟机



  • 类加载子系统从网络或者文件系统加载class信息,加载的类放在一块成为方法区的内存空间。

    • 方法区存放运行时常量池信息(包括 字符串 字面量 数字常量),都是通过常量池部分的内存映射。-xx:PermSize -xx:MaxPermiSize

    • java堆 是主要的内存工作区,几乎所有的java对象实例都存在java堆中。堆空间的所有进程都是共享的。

    • java 1.7支持NIO允许程序使用直接内存。直接内存是在java堆外的,直接的向系统申请内存区间。访问直接内存速度优于java堆,适合频繁读写的场合,这个内存的大小取决于系统内存大小。-XX:MaxDirectMemorySize 一般的认为直接内存比堆内存快40%

    • 垃圾回收可以对方法区 java堆栈 和直接内存进行回收。

      • -XX:+PrintGC or -XX:+PrintGCDetail

      • -XX:+PrintGCTimeStamps(打印发生时间)

      • -XX:+PrintGCApplicationConcurrentTime 打印应用程序的执行时间

      • -XX:+PrintGCApplicationStoppedTime 可以打印应用程序由于GC而产生的停顿时间

      • -XX:+PrintReferenceGC 如果想跟踪系统内的软引用 弱引用 和 Finallize队列

      • -XX:+TraceClassLoading跟踪类的加载

      • -XX:+TraceClassUnloading跟踪类的卸载

      • -XX:Perm

      • 堆溢出  -XX:+HeapDumpOnOutOfMemoryError

      • 发生溢出导出线程转存的例子


    • 每一个虚拟机都有一个私有的,栈中保存在局部变量和方法参数 java方法的调用

      • -Xss 线程的栈大小

    • 本地方法栈 用于本地方法调用

    • pc 寄存器也是每一个线程私有空间,每一个java线程创建pc寄存器。

    • 执行引擎是java虚拟机的最核心的组件之一,负责执行虚拟机的字节码

  • Xms堆内存 xss 栈内存

  • 新生代配置  -Xmn

    • 新生代分为 eden空间 from空间 to空间 三个部分  from和to空间也叫survior空间

      • -XX:SurviorRatio=eden/from=eden/to 空间比例关系

      • -XX:NewRatio 来设置老年代/新生代

  • 老年代使用标记压缩法

    • 标记压缩法就是从根节点出发标记所有可达对象做一次标记,然后将所有存活的对象压缩到内存的一端,最后清理边界外所有空间。

  • 出入栈

    • java堆和数据密切相关,那么java栈就和线程执行密切相关

      • 每一次函数调用都有一个栈被压入java栈,每一个函数调用结束,就有一个栈帧弹出java栈。

      • java方法有两种返回函数的方式,一种是正常的函数返回,一种是抛出异常。

  • 操作数栈

    • 操作数栈也是栈帧中重要内容之一,他主要用语保存计算过程的中间结果,同时作为计算过程中的变量的存储空间。

  • 帧数据区

    • 保存着访问常量池的指针,方便程序访问常量池。

  • 栈上分配(-XX:EliminateAllocations默认打开 -XX:+printGC 打印gc日志)

    • 对于线程私有对象,可以打散分配在栈上,而不是分配在堆上。不需要调用垃圾回收,提高系统性能。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章