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:
- 设置堆小一些 不断创建对象 添加到list :堆溢出
- 线程死循环和一个线程无限等:查看逻辑错误和无限等待问题
- 死锁:查看问题
- 当堆溢出的时候(JVM参数设置) 可以把溢出的错误信息设置到某个文件下作为快照(需要使用工具打开进行分析)