一、什么是jvm
java虚拟机,java之所以跨平台通过jvm运行环境实现。
详细jvm内存结构
其中,方法区和堆线程(共享区),其他是线程私有程序计数器
内存空间小,线程私有。通过改变计数器的值来选取下一条需要执行指令的字节码指令,分支、异常处理、循环、跳转、线程恢复等基础功能需要依赖计数器完成。
java内存泄漏、溢出场景
泄漏:对象一直被引用,但不会调用
溢出:内存泄漏导致堆栈内存增大
1、大量的jar、class文件加载,导致空间不足
2、操作大量的对象内存空间
3、nio直接操作内存
解决方法:
查看程序具体泄漏问题,设置参数加大空间,代码是否存在死循环,或循环产生过多重复对象实体
二、java线程池
线程池一般值虚拟机栈。
jvm规范让每个java线程拥有独立的jvm栈,也就是调用方法栈。
调用的时候,生成一个栈帧。栈帧保存在虚拟机栈中的,栈帧存储局部变量表、操作数栈、动态连接和方法返回地址等信息。
当线程运行时候,当前活动始终是虚拟机栈的栈顶元素。
什么是java双亲委派模式,有什么场景打破这模式?
双亲委派模式为了解决类载入过程中的安全问题,
例子:自己写了 java.lang.Object的类,欺骗jvm。通过双亲委派模式,JVM会优先在 BootstrapClassLoader的路径下找到 java.lang.Object类,并载入它
三、jvm完整的GC流程
1、YGC :对新生代堆进行gc。频率比较高,因为大部分对象的存活寿命较短,在新生代里被回收。性能耗费较小。
2、FGC :全堆范围的gc。默认堆空间使用到达80%(可调整)的时候会触发fgc。以我们生产环境为例,一般比较少会触发fgc,有时10天或一周左右会有一次。
联系客服