jvm基础笔记

名词解释:

三类参数:标准参数(可能不会变的,java -help列出来的就是这类的),X参数(非标准化参数),XX参数(扩展参数)。

所有XX 参数都以-XX开始,但后面出现的+-就不同了。+代表激活参数,-代表消除参数。

NIO new input/output -- jdk1.4引入的新类。使用native函数直接分配内存。可以避免java堆和native堆间来回切换。

虚拟机栈:存储局部变量表,动态链接,方法出口。线程私有,生命周期与线程一样。

本地方法栈:类似虚拟机栈。不同在于虚拟机栈执行java服务,本地栈执行native服务。

请求的栈深度大于虚拟机允许的深度:stackoverflow错误

关于栈的深度:每次方法调用都会有一个栈帧压入虚拟机栈,操作系统给JVM分配的内存是有限的,JVM分配给“虚拟机栈”的内存是有限的。
如果方法调用过多,导致虚拟机栈满了就会溢出。
这里栈深度就是指栈帧的数量。

扩展时无法申请到足够的内存:outofmemoryerror

java堆:存储对象实例。GC系统的主要区域。堆内容不够。outofmemoryerror

方法区(nonheap):各线程共享,常量,静态变量,类信息等。方法区有个别名叫permanent Generation(永久代)。

分配对象内存方式:指针碰撞(内存整齐的情况下) 空闲列表(内存不整齐的情况)

    • 指针碰撞(Serial、ParNew等带Compact过程的收集器)
      假设Java堆中内存是绝对规整的,所有用过的内存都放在一边,空闲的内存放在另一边,中间放着一个指针作为分界点的指示器,那所分配内存就仅仅是把那个指针向空闲空间那边挪动一段与对象大小相等的距离,这种分配方式称为“指针碰撞”(Bump the Pointer)。

    • 空闲列表(CMS这种基于Mark-Sweep算法的收集器)
      如果Java堆中的内存并不是规整的,已使用的内存和空闲的内存相互交错,那就没有办法简单地进行指针碰撞了,虚拟机就必须维护一个列表,记录上哪些内存块是可用的,在分配的时候从列表中找到一块足够大的空间划分给对象实例,并更新列表上的记录,这种分配方式称为“空闲列表”(Free List)。

分配内存在并发情况下并不是线程安全的,有两种策略:1.CAS(乐观锁)配上失败重试。2.本地线程分配缓冲(TLAB)。预先将一小块内存分配给不同的线程,只有预分配内存不够时才采用同步锁机制。

内存溢出例子:

堆溢出:不断创建对象,在垃圾回收机制之前对象过多导致内存溢出。

    现象:outofmemory, java heap space。

       解决方案:分清是内存泄漏(memory leak)还是内存溢出(memory over flow)。dump出的堆转储快照进行分析。确认内存中的对象是否是必要的。

栈溢出:使用-Xss减少栈内存容量;定义大量的本地变量。

          现象:stackoverflow

  解决方案:使用虚拟机默认参数:在大多数情况下,达到1~2000的线程数并发是没有问题的。如果是多线程并发导致内存溢出的情况,在不能减少线程数或者升级内存的情况下,减少最大堆和减少栈容量也是一种方法。

方法区和运行时常量池溢出:

本机直接内存溢出:- XX设置。

  现象:如果OOM之后Dump文件很小,可以考虑此原因。

判定对象是否存活:

  普遍算法:给对象添加计数器。有一个引用+1。引用失效-1.计数器为0对象失效。

    无法解决的问题:a.instance = b; b.instance = a;无其他引用,但计数器永远不会为0。

  eclipse开启gc打印日志:

  -verbose:gc (开启打印垃圾回收日志) 
  -Xloggc:eclipse_gc.log (设置垃圾回收日志打印的文件,文件名称可以自定义) 
  -XX:+PrintGCTimeStamps (打印垃圾回收时间信息时的时间格式) 
  -XX:+PrintGCDetails (打印垃圾回收详情)

  可达性分析算法:通过一系列称为GC Root的对象作为起始点。当一个GC对象没有任何引用链相连,就是说GC Root对象不可达,则证明此对象不可用。

  java语言中:GC Roots包括虚拟机栈引用的对象,方法区中类静态属性引用的对象,方法区常量引用的对象,本地方法栈中native引用的对象。

minor gc 和full gc

新生代gc:发生在新生代的gc动作。频繁。采用复制算法复制内存。

老生代gc:老生代的gc动作。不频繁,回收速度较慢。大对象直接进入老年代。典型的例子为:长字符串或者数组。jvm为了安置它们需要提前gc。

原文地址:https://www.cnblogs.com/guochunyi/p/6185871.html