JVM的干货

JVM:

用JVM来运行程序的时候,需要内存空间。程序是一个Java class文件,类的定义放在方法区中,程序在运行中会产生各种各样的对象,对象就存在于堆中,程序在执行的时候,其实是启动多个线程来执行,main就是一个主线程,来调用方法,方法中存在局部变量,局部变量放在栈,栈中分成线程存放,每个线程都有自己的栈空间,所以在栈中线程私有,堆是线程共享的。栈空间可能会溢出,常常出现递归嵌套的程序中,因为要不断压栈,栈的深度是有限的,可能会造成溢出。

垃圾回收:

方法区(线程共享的区域):类信息 常量  静态变量 和编译器编译之后的信息

堆:对象(新生代  老年代 )

根据对象的存活的年龄划分新生代和老年代,把新生代幸存的放到from区,不断进行来及回收,当死不了的时候放到老年代中,to区是用来复制  腾挪使用。 默认 8:1:1 大对象直接进入老年代

判断对象是否可用:根节点搜索算法

垃圾回收算法:标记清除   标记整理   复制

参数:

-xmx最大堆内存

-xms开始堆内存

-xmn年轻代的大小

-Xss栈的大小

… 年轻代和老年代的大小(默认4:1)

… 年轻代中的比例  8:1:1

.. 设置年龄(进入老年代的时间  默认值15)

在JDK的bin目录下可以使用jconsole和jvisualvm来查看Java程序的相关信息。可以看到一些详细的信息。

程序测试JVM:

  1. 设置堆小一些 不断创建对象 添加到list :堆溢出
  2. 线程死循环和一个线程无限等:查看逻辑错误和无限等待问题
  3. 死锁:查看问题
  4. 当堆溢出的时候(JVM参数设置) 可以把溢出的错误信息设置到某个文件下作为快照(需要使用工具打开进行分析)
原文地址:https://www.cnblogs.com/hds-study-blogs/p/6904266.html