一、物理内存与虚拟内存:
1、物理内存即RAM(随机存储器)
2、寄存器,用于存储计算单元指令(如浮点,整数等运算)
3、地址总线:连接处理器和RAM
4、虚拟内存使得多个进程在同时运行可以共享内存
二、内存空间与用户控件
1、内核空间指操作系统运行时所使用的用于程序调度,虚拟内存的使用或连接引荐资源等程序逻辑
2、用户空间指用户运行程序所占的内存空间
三、java中需要使用的组件
1、java堆
(1)定义:用于存储java对象的内存区域
(2)-Xmx表示堆的最大大小
(3)Xms表示堆的初始大小
(4) 一旦分配完成,就不能在内存不够时再向操作系统申请
2、线程
定义:每个线程创建时JVM会为线程创建一个堆栈,通常在256k-756k之间
3、类和类加载器
在SUN JDK中被存储在堆中,这个区域叫永久代(PermGen):只有HotSpot才有PermGen space; JRockit(Oracle),J9(IBM)并没有PermGen space;JDK1.8中PernSize和MaxPerGen已经无效,jdk1.8使用元空间替 代PermGen空间,元空间并不在虚拟机中,而是在本地内存;
默认的3个类加载器:1、Bootstrap ClassLoader;2、ExtClassLoader;3、AppClassLoader
4、NIO
jdk1.4版本之后引入了一种基于通道和缓冲区来执行I/0的新方式,使用java.nio.ByteBuffer.allocateDirect()方法分配内 存、分配的是本机内存而不是java堆内存,每次分配内存是会调用操作系统的os::malloc
5、JNI
JNI使得本机代码(如C语言程序)可以调用java方法,也就是native memory
四、JVM内存结构
1、PC寄存器:记录线程当前执行到哪条指令
2、栈
3、堆
4、方法区:用于存储类结构信息,可以被所有线程共享,它不会频繁的GC
5、运行时常量池:代表运行时每个class文件中的常量表((1)、数字常量;(2)、方法;(3)、字段的引用)
6、本地方法栈:为JVM运行Native方法准备的控件
五、JVM内存回收策略
1、回收原则
引用计数法:给对象中添加一个引用计数器,每当一个地方引用这个对象时,计数器值+1,当引用失效时,计数器 值-1.这种算法使用场景很多,但是,java中却没有使用这种算法,因为这种算法很难解决对象之间相互引用的情况;
2、可达性分析
通过一系列称为“GC Roots”的对象作为起点,从这些节点向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链(即GC Roots到对象是不可达)时,则证明此对象是不可用的。
3、引用状态
(1)强引用:代码中普遍存在的类似“Object obj=new Object()”这类引用,只要强引用还存在,垃圾收集器永远不 会回收掉被引用的对象;
(2)软引用:描述有些还有用但并非必要的对象,在系统将要发生内存溢出异常之前,将会把这些对象列进回收范围 进行二次回收,如果这次回收还没有足够的内存,才会抛出内存溢出异常,java中的softRefence表示软引用;
(3)弱引用:描述非必须对象,被若引用关联的对象只能生存到下一次垃圾回收之前,垃圾收集器工作之后,无论当 前内存是否是足够,都会回收掉只被弱引用引用关联的对象。java中的类的WeakReference表示若引用
(4)虚引用:这个引用存在的唯一目的就是在这个对象被收集器回收时收到一个系统通知,被虚引用的关联的对象, 和其生存时间没有关系。java中的类PhantomReference表示虚引用
4、方法区的垃圾回收
(1)废弃常量:以字面量回收为例,如果一个字符串“abc”已经进入常量池,但当前系统没有任何一个String对象叫做 “abc”的字面量,那么如果发生垃圾回收并且有必要时,“abc”就会被清除常量池
(2)无用的类:该类的所有实例都已经被回收,即java堆中不存在该类的任何实例;加载该类的ClassLoader已经被回 收;该类对应的java.lang.class对象没有任何地方被引用,无法在任何地方通过反射访问该类的方法
5、垃圾收集算法
(1)标记-清除(Mark-Sweep)算法
(2)复制(Copying)算法
(3)标记-整理(Mark-Compact)算法
(4)分代收集算法
六、JVM参数
-Xmx3550m:设置堆最大值
-Xms3550m:设置初始堆大小
-Xss128K:设置线程大小
-Xmn2g:设置年轻代大小,在整个堆内存大小确定的情况下,增大年轻代将会减小老年代,反之亦然
-XX:NewSize=1024:设置年轻代的初始值
-XX:maxNewSize=1024m:设置年轻代的最大值
-XX:Permsize=256m:设置持久代最大值
-XX:NewRatio=4:设置年轻代和老年代的比值(包括一个Eden和两个Suvivor)
-XX:SurvivorRatio=4:设置Survivor区和Eden区的比值
-XX:MaxTenuringThreashold=7:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)