JVM 笔记

来源:互联网 发布:数据冗余怎么读 编辑:程序博客网 时间:2024/04/24 18:41

1.程序计数器,每个线程都有自己的程序计数器。  线程私有的。

2.OutOfMemoryError简称OOM。

3.虚拟机栈:经常有人把jvm分为堆和栈,这里的栈就是指虚拟机栈中的局部变量表部分。存基本类型,和引用也是线程私有的

4.Native关键字是什么?是jni编程,别的编程语言嵌套在java里面。本地方法栈。

hotspot虚拟机并不区分虚拟机栈和本地方法栈,-Xss来设置栈的容量大小。

5.java堆:内存管理时内存回收。放对象的。是线程共享的。上面三个是线程私有的。注意。  配置java堆的大小用:-Xmx最大值   -Xms最小值    ,如果这两个值设为一样的,那   线程共享的


么就避免自动扩展。就是说堆的大小固定了。不能扩展。

6.方法区:也是线程共享的。放类的信息+static变量+常量。

方法区和运行时常量池。后者是方法去的一部分。用 -XX:PermSize    -XX:MaxPermSize 来设置。


分代收集:新生代,老年代

回收:

1.引用计数法:没有引用就认为对象死了。可以 回收。有问题:互相引用,但是整体对外没有引用。不会回收,造成内存泄漏。

2.可达性分析:GC ROOT对象作为起点,看能不能可达性这个对象。没有就回收。GC ROOT对象有哪些?方法去里面引用的对象。虚拟机栈里面引用的对象。

 回收方法区(永久代),一般不要求虚拟机在方法区回收。 也可以回收,回收废弃的常量,和无用的类。

-Xmn 表示新生代的大小。   -XXSurvivorRatio 表示Eden和Survivor的比值。

3.新生代:用复制算法回收垃圾。把内存分为Eden+surviver+survivor三块。清理的时候,清理1,2,然后把活着的对象放入3上面。通常是1:1:8  

老年代:


类的加载机制:

1.虚拟机把class文件加载到内存(类加载器完成的),(验证,准备,解析)连接,初始化,使用,卸载。这几个操作都是在运行时完成的,与别的语言不一样,别的语言是在编译的时候连接。

加载做了什么:1.按照这个类的全限定名获取这个类的二进制字节流。2.生成这个类的class对象。在哪里生成。内存里。

2.类加载器:启动类加载器(搜索JAVA_HOME/lib下面的库),这是虚拟机的一部分,其他的加载器都是在虚拟机的外部。扩展类加载器(搜索JAVA_HOME/lib/ext下面的库),应用程序类加载器(用户路径上知道的类库)。自定义加载器。

双亲委派模型是:当一个类加载器收到加载类的请求的时候,他首先不会去加载这个类,他会委派给他的父类加载器来完成。直至到达顶层的启动类加载器。只有当父类加载器反馈自己无法完成加载请求(意思就是在他的搜索路径中没有搜索到所需的类)。子类加载器才会尝试去加载这个类。


new对象的过程,先看这个类是不是加载,初始化过;如果堆是绝对规整的,那么就用一个指针分配空间即可,带压缩功能。能维护成工整的。如果不是工整的。那么就用一张表来标记是不是使用了这块堆内存。

0 0
原创粉丝点击