首页 > 其他 > 详细

JVM笔记

时间:2018-09-14 00:43:31      阅读:262      评论:0      收藏:0      [点我收藏+]

1. JVM

1.1 什么是JVM

  JVM为Java虚拟机(Java Virtual Machine)

 

  Runtime data area,运行时数据区。

  包含5个区域,分别为:

  method area         (方法区)

  heap                        (堆)

  java stack           (java栈)

  native method stack     (本地方法栈)

  program counter register。  (程序计数器)

 

  图示如下:

 

技术分享图片

 

 

1.2 method area(方法区)

  用于存储已被虚拟机加载的类型信息、常量、静态变量、即时编译后的代码等信息。

  方法区是线程间共享的,当两个线程同时需要加载一个类型时,只有一个类会请求ClassLoader加载,另一个线程会等待。

1.3 heap(堆)

  虚拟机中用于存放对象与数组实例的地方,垃圾回收的主要区域就是这里(还可能有方法区)。

  如果垃圾收集算法采用按代收集(目前大都是这样),这部分还可以细分为新生代和老年代。新生代又可能分为Eden区,From Survivor区和To Survivor区,主要是为了垃圾回收。所有的线程共享Java堆,在这里还可以划分线程私有的缓冲区(Thread Local Allocation Buffer,TLAB)。

1.4 java stack(java栈)

  虚拟机栈也是线程私有的,每创建一个线程,虚拟机就会为这个线程创建一个虚拟机栈。

  虚拟机栈表示Java方法执行的内存模型,每调用一个方法,就会生成一个栈帧(Stack Frame)用于存储方法的本地变量表、操作栈、方法出口等信息,当这个方法执行完后,就会弹出相应的栈帧。

  栈帧分为三部分:局部变量区(Local Variables)、操作数栈(Operand Stack)和帧数据区(Frame Data)。

  如果请求的栈的深度过大,虚拟机可能会抛出StackOverflowError异常,如果虚拟机的实现中允许虚拟机栈动态扩展,当内存不足以扩展栈的时候,会抛出OutOfMemoryError异常。

1.5 native method stack(本地方法栈)

  与虚拟机栈类似,只是是执行本地方法时使用的。

1.6 program counter register。(程序计数器)

  类似于PC寄存器,是一块较小的内存区域,通过程序计数器中的值寻找要执行的指令的字节码,由于多线程间切换时要恢复每一个线程的当前执行位置,所以每个线程都有自己的程序计算器。这一个区域不会有OutOfMemeryError。当执行Java方法时,这里存储的执行的指令的地址,如果执行的是本地方法,这里的值是Undefined。

1.7 栈 & 堆 溢出

  栈溢出:Stackoverflow

  堆溢出:Out Of Memory

2. JVM从堆角度划分

2.1 堆 & 非堆 & 离堆堆

   堆用来存放所有的对象和数组,在堆内空间又分为年轻代和年老代。

      • 年轻代

         年轻代分为伊甸区和幸存区。所有对象诞生于伊甸区,然后回收后经过幸存区。

        • 伊甸区

            所有对象诞生于伊甸区。

        • 幸存区

            之所以使用两个幸存区,是为了在每次回收对象后,可以进行内存碎片整理。以利用更有效使用内存。

            一区和二区也称为from区和to区,每次有一个区是空间是空的。但对象回收期间每个幸存区只经过一次。

          • 幸存一区
          • 幸存二区
      • 年老代

 

  • 非堆

   非堆是JVM内在堆外部分的内存,主要包含代码缓存区、压缩类空间和元数据区。JDK1.8之前称为永久区。

  • 离堆

   离堆是操作系统内JVM之外的内存空间。java可以直接操纵jvm之外的内存空间。

2.2 参数调整

  jdk1.8之后,没有永久代的概念了,改成了元空间的叫法。而且官方文档上说不会再出现永久区的溢出问题,比如在使用maven进行编译时常常导致的问题。

 

参数 解释  示例  备注
-Xms 初始堆大小 -Xms100m  
-Xmx 最大堆设置 -Xmx100m  
-Xmn 年轻代设置 -Xmn100m  
-XX:NewSize 年轻代大小 -XX:NewSize=100m  
-XX:MaxNewSize 年轻代最大值 -XX:MaxNewSize=100m  
-XX:NewRatio 年老代是年轻代的倍数 -XX:NewRatio=3,默认2  
-XX:SurvivorRatio 伊甸区是单个幸存区的倍数 -XX:SurvivorRatio=1,默认6  
-XX:MetaspaceSize 元空间大小 -XX:MetaspaceSize=1g not work
-XX:MaxMetaspaceSize 最大元空间  -XX:MaxMetaspaceSize=2g not work
-XX:CompressedClassSpaceSize 压缩类空间 -XX:CompressedClassSpaceSize=2g not work
-Xverbosegclog 记录gc详细日志到文件 -Xverbosegclog:/home/1.log WAS(Websphere application server)中使用
-Xloggc 记录gc日志 -Xloggc:/home/1.log JDK非标选项

 

 

 

 

 

 

 

 

 

 

 

3. JVM相关工具

3.1 jvisualvm

  打开:Windows+R   -->    jvisualvm

  打开IDEA中运行程序,就能看到 jvisualvm 界面中的情况

  将所有区设为100M:

  -Xms400m -Xmx400m -Xmn300m -XX:SurvivorRatio=1

 

技术分享图片

 

 

 

3.2 jconsole

  打开IDEA中运行程序 

  打开:Windows+R   -->   jconsole

技术分享图片

 

技术分享图片

 

JVM笔记

原文:https://www.cnblogs.com/share23/p/9643094.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!