JVM相关

jdk>jre>jvm,利用JVM可以将编译好的字节码文件再各处运行

JVM运行时数据区结构?

内存共享的有堆(类加载后的class对象也是反射的class对象,静态变量(class对象的尾部),字符串常量池在堆里,堆中存放实例信息)和方法区(jdk8后变为在内存中的元空间不占用JVM空间,这里存放类信息,运行时常量池(字面量和符号引用)),内存私有的有虚拟机栈(一个方法对应一个栈帧,方法的局部变量在此),本地方法栈,程序计数器。

JVM类加载过程?

加载-》链接-》初始化

加载:加载由类加载器完成,类加载器双亲委派模型,加载一个类时先寻找其父类加载器,若父类无法加载才会自己尝试加载,顺序是启动类、扩展类、应用类、自定义。通过双亲委派模型可以防止一个类被重复加载,也不会出现加载结果出现冲突的问题。要想打破双亲委派模型,可以继承classloader类,重写load class方法。

加载阶段会根据全类名生成二进制字节流,并创建该类的一个class对象,作为方法区数据的访问入口。

链接:验证,准备,解析

验证:主要检查文件、程序等是否存在危险与错误

准备:为一些静态变量分配内存空间,并会给静态变量赋默认值

解析:将符号引用转化为直接引用。

初始化:

创建对象,给静态变量赋真实值,调用静态方法,加载子类前会先加载其父类。

==================================================================

线上问题排查方法

OOM:

MAT(Memory Analyzer)工具载入dump文件,可以在Dominator Tree下查看报错类型,在删除文件时使用File.deleteOnExit()时,并不会立即删除文件,而是将该文件路径维护在一个LinkedHashSet中,JVM关闭时才会真正删除,这样程序长期运行势必会发生OOM,File.delete()可以立即删除。

-xmn设置的新生代大小必须小于-xmx规定的堆大小。

死锁的检测:

可以利用jps查看发生死锁的进程id,DeadLockDemo,然后利用jstack查看当前进程的线程快照,展示每一个线程的具体在做什么,等待什么资源,会展示在哪一行代码发生了阻塞。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值