JVM主要分三块:
类加载子系统
执行引擎
java运行时数据区
本地方法栈服务的对象是JVM执行的native方法,而虚拟机栈服务的是JVM执行的java方法
栈(虚拟机栈和本地方法栈)、程序计数器是线程私有的很好理解:每个线程执行都需要记录代码执行的位置和所需要的变量已经方法调用(主要是代码的开始地址) 这样当然需要为每一个线程维护自己的栈和计数器了
虚拟机栈的每个方法栈桢都包括: javap的指令就用到
局部变量表、操作数栈、动态链接和方法返回地址
局部变量表: 保存栈桢中定义的局部变量
操作树栈:栈桢中操作数据的时候使用的栈空间 配置局部变量表实现变量赋值操作
方法返回地址:栈桢操作完毕后将结果返回 例如main中调用其他方法 栈桢完成后将返回结果返回main方法中 并赋值到局部变量表中
动态链接:保存指向运行时常量池中该栈帧所属方法的 引用 在编译到运行期间 使符号引用(此时并不知道对象的实际内存地址 只是用符号代表引用这个对象)变成 对象加载到内存后的直接引用(通过指针 相对偏移量或者句柄)
java源文件给程序员看
java class文件给jvm看 通过执行引擎(javap指令就看到 每条指令前有程序计数器需要检索的数字–行号 来记录接来下执行哪行代码)来执行代码 完成跨平台
要知道 java引用有 强引用 软引用 弱引用 虚引用
堆:
eden区满了 触发轻gc ------ minor GC
minorGC有用几个过程 (1)从eden进入from age+!
(2)从from进去to age+1 并且from to对调
15次minor GC对象都不清除会进入老年代
老年代内存足够大后会引发full GC
性能调优目的就是为了减少STW的次数:尽量避免老年代的full gc--- --- ----而full gc很容易引发jvm stop the world
是在执行垃圾收集算法时,Java应用程序的其他所有线程都被挂起(除了垃圾收集帮助器之外)。Java中一种全局暂停现象,全局停顿,所有Java代码停止,native代码可以执行,但不能与JVM交互;这些现象多半是由于gc引起
=======为什么需要from 和 to
和底层垃圾回收算法有关
=======jvm内存体积大小
可以用java自带的visual lvm工具查看堆内存和GC的过程, visual lvm可以实时查看进程的cpu、堆、线程等参数,也可以查看哪里有死锁 ---deadlockdemo
用dump查看
jmap -heap [pid] 查看jvm内存运行状态
jmap -histo [pid] 查看jvm堆中详细运行情况
jmap -dump:file=文件名.dump [pid] 生成dump 文件 可以用visuallvm进行分析
Reference
Rederence包下面主要有这些类
StrongReference:平常new生成相对并赋值的方法都是强引用 不会被GC回收 出问题之际抛异常 除非方法栈结束/引用置null才会被垃圾回收
SoftReference :软引用 jvm空间不足需要回收的时候才会回收 会在出现 OOM 错误之前被回 SoftReference 调用 get() 方法获取该对象的强引用。如果这个softReference对象没有被 gc 回收,则返回此对象,否则返回 null 。
WeakReference:下一次垃圾回收只要找到这个类就直接回收
PhantomReference:虚引用 无法直接get获取对象的强引用 主要用来标志对象被销毁的过程 用来在对象销毁时候执行任务
FinalReference
通过对象可达性进行判断:
从根节点出发 经过的节点引用有上述几个 强引用对象不会被GC 其他的按照上面的规则进行GC 而强引用断裂置空的对象 孤立的对象就会被回收(还需要经过两次标记 涉及F-QUEUE队列 和 finalie方法----可以在此方法中也就是第二次标记中复活对象 第一此标记是判断没引用的对象时是否需要调用fialzie方法 需要的进入F-queue 第二次标记是判断对象是否能逃离垃圾回收而复活)