JVM初识

来源:互联网 发布:my sql 导入 库 编辑:程序博客网 时间:2024/05/09 21:27
## JVM初识
1. JVM虚拟内存组成及操作系统地址表
- 虚拟地址大致概念:
- 内存分配:
- JVM内存组织
- HeapSize
- Young
- Virtual
- Eden
- Survivor(2)
- Tenured
- Virtual
- PermSize
- Virtual
2. 新生成对象在HeapSize是如何变化的
- java新创建对象的方法有哪些:
- new操作
- java.lang.Class.forName
- jvm初始化需要做什么?
- 每一个Class都有自己独立的私有池去管理自身的结构
- 动态装载的class一般是不会JVM初始化的时候转入Perm的,而是运行时动态装载进去的
- 动态装载做什么?它负责的是运行时装载一些类的定义,而不是初始化
- 当然,当你通过全名去加载的时候,他们会从符号向量中寻找这个类是否已经加载,如果已经加载则直接使用,否则从相应的包中获取这个class定义,然后装载起来,装载的单位也是以class为单位,并不是以jar包为单位,这里请大家如果不要滥用动态加载,一个是造成Perm的不稳定,另一个是它的效率肯定没有new高

- 内存申请时的指针与实例
- 内存分配后放在哪里,如何移动
- 在java设计的看来有一个特别有意思的地方,就是它在新生成的对象中它认为你绝大部分对象都是应该需要被销毁掉的
- 三种情况对象会被晋升到old区域
1. 在eden和survivor中可以来回被minor gc多次,这个次数超过了-XX:MaxTenuringThreshold
2. 在发生minor gc时,发现to survivor无法放下这些对象,就会进入old。
3. 在新申请对象,大于eden区域的一半大小时直接进入old,也可以专门设置参数-XX:PretenureSizeThreshold这个参数指定当超过这个值就直接进入old。
- Perm一般还会存放什么内容
- 还一般会存放的内容有静态代码段、final static类型的类变量、String常量以及String被intern后的内容
3. 虚拟机如何定义回收算法
- 对象的查找算法
- 引用计数
- 引用树遍历
- 真正如何回收的方法
- 标记清除算法
- 标记清楚压缩
- 复制回收
- 增量回收
- 分代收集器
- 并发回收
- 并行回收
4. JVM占用的空间除HeapSize还会占用什么
- 常见的OOM现象有以下几种
1. heapSize溢出,这个需要设置Java虚拟机的内存情况
2. PermSize溢出,需要设置Perm相关参数以及检查内存中的常量情况。
3. OS地址空间不够,也就是没有那么多内存分配,这个一般是启动时报错。
4. Swap空间频繁交互,进程直接被crash掉,在不同操作系统中会体现不同的情况。(不明白,passing)
5. native Thread溢出,注意线程Stack的大小,以及本身操作系统的限制。
6. DirectByteBuffer溢出,这一类一般是在做一些NIO操作的时候,或在某种情况下使用ByteBuffer,在分配内存时使用了allocateDirect以及使用一些框架间接调用了类似方法




## Java对象内存模型(看不懂,passing)
1. class是如何加载和对象如何绑定的
0 0