JVM学习之札记

来源:互联网 发布:oracle索引优化 工具 编辑:程序博客网 时间:2024/05/17 01:54

1.虚拟机指令

JVM要涉及的东西太多太多,从虚指令开始都可以学习很久,我是直接跳过对于Java虚拟机指令的学习的,我想这个只要能看懂javap工具输出的指令程序。当然了重要的是明白任何一个Java操作它的背后都隐藏着若干步的虚拟机指令,所以这就让我想达到了原子化。这里当然

2.JVM板块划分

当然了JVM内部是有着很多不同区域的:

Java堆,永久代,栈空间(线程私有栈),本地方法栈(C部分的代码区域),C Heap(非Java区域的内存,JNI).

对于程序员来说只需要关注Java堆就ok,那么就来说说Java堆,Java堆里面分为Young代和Old代.

Young代:它有三个区Eden区,Survivor0和Survivor1区,Young代里的垃圾回收叫MinorGC。

Old代:普遍来说如果Survivor区域存放不下的对象会进入到Old区,我们称这个过程为”晋升“,那么如果Old区域也已经存放不下要晋升上来的对象此时

就会开始做FullGC,当然不仅仅是Old区域满的时候才做FullGC,还有很多比如永久代满的时候也会FullGC。一次FullGC会占用大量系统资源,所以会导致系统变慢,当然FullGC越多问题会越严重。

所以JVM调优的本质就是尽量不要让JVM发生FullGC,当然这也要根据具体场景来区分了,这里只是说明普遍现象。一般的做法是尽量的不要在JVM里面使用缓存,或者数据类,而是把他们从JVM分离出来,这样就会减轻JVM负担。

StackOverflowError,栈溢出,一般来说如果是死递归便会导致此问题的出现。

对于出现OOM问题的解决方案:

使用Visual VM直接对监控的JVM进程单击右键,选择“Heap Dump”,将JVM的内存dump出来,使用MAT(Memory Analyzer Tool)来导入此dump文件便可以分析出是什么类占用了大部分内存。如果不能找到到底是哪个类,那么此时使用BTrace工具来实现代码跟踪,具体使用方法百度。


0 0
原创粉丝点击