JVM 笔记

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

2.OutOfMemoryError简称OOM。

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

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

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

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


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

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

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

Hotspot中方法区就是永久代。

垃圾搜集算法:

1.标记清除算法:就是先标记要清除的对象。然后再统一清除。缺点是一是产生大量的内存碎片。二是标记+清除这两个部分的效率都不高。

2.复制算法:将内存区域分为大小相同的两半,当一个用完了,把折半活着的对象复制到另一半上面。然后统一收集掉这一半。缺点是浪费了一半的内存。

新生代搜集用复制算法:Eden  Survivor  Survivor=8:1:1 。8+1回收进入最后一个survivor。

3.标记整理算法:也是先标记要清除的对象,然后进行碎片整理。把这些对象移到一起来。然后统一回收。看书上的图。

4.分代收集算法:分为新生代+老年代

老年代不用复制算法:原因是如果存活的对象较多,复制算法效率低。复制很多东西。所以老年代不用复制算法。

回收:

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值