JVM随笔
JVM存在位置

JVM内存模型
JVM调优位置:主要在堆区和方法区调优

new一个对象的处理过程 类是模板,具体的数据是对象(男和女都是人,男和女是对象,人是类)
双亲委派机制(安全):类加载器收到类加载请求时,将这个请求向上委托给父类加载器去完成,一直向上委托,直到启动类加载器,启动类加载器能加载就结束,使用当前类加载器,否则抛出异常,通知子加载器进行加载。否则重复步骤。常见异常(Class Not Found)
为什么父类加载器为NULL:Java调用不到,因为顶层加载器为C或者C++写的。
沙箱安全机制:java安全模型的核心
组成沙箱的基本组件:♦字节码校验器:确保java类文件执行java语言规范,检查时异常等
♦ 类装载器:防止恶意代码干涉善意代码,守护了被信任的库边界,将代码归入保护域确定了代码可以进行哪些操作(类加载器采用的是双亲委派模式)
Native:凡是加了Native关键字的,说明java的作用范围达不到了,会去调用底层C/C++的库。会进入本地方法栈,调用本地方法接口(JNI)。JNI的作用说白了就是为了扩展Java的使用,融合不同的编程语言为Java所用。
PC寄存器:每一个线程都有一个程序计数器,是线程私有的,就是一个指针,指向方法区中的方法字节码,在执行引擎读取下一条指令,是一个非常小的内存空间
方法区:方法区是所有线程共享的,所有的字段和方法字节码,以及一些特殊方法都放在方法区。静态变量,常量,类信息(构造方法,接口定义),运行时常量池都存在于方法区中。但是,实例变量存在于堆内存中,和方法区无关。
栈:先进后出,后进先出。一旦线程结束,栈就关闭。栈不存在垃圾回收。(8大基本类型,对象引用,实例方法)。队列:先进先出。
栈+堆+方法区的交互关系:绿色代表栈,蓝色代表堆,深蓝色代表常量池,粉色代表方法区

堆(Heap):一个JVM只有一个堆内存,堆内存大小是可以调节的。堆中存在的东西有类,方法,常量,变量,保存我们引用类型的真实对象。即堆放对象栈放数据。
堆内存中分为三个区域分别为:一般比例为:8:1:1。垃圾回收一般在新生代和老生代。新生代的叫轻量级垃圾回收(轻GC) 新生代满了之后的垃圾回收叫重量级垃圾回收,将新生代对象放入老生代(重GC也叫Full GC)。内存满了会报错(OOM)即堆内存不够
-
-
-
-
- 新生代:类:诞生和成长,甚至死亡的地方。伊甸园:所有的对象都是在伊甸园区new出来的 幸存者区(0,1):
- 老生代:经过垃圾回收机制没有淘汰的对象进入老生代。
- 永生代:jdk1.6之前叫永久区,常量池在方法区;jdk1.7叫去永久代,常量池在堆中;jdk1.8之后无永久代,常量池在元空间。
-
-
-

元空间逻辑上存在,物理上不存在。原因是新生代老年代的内存和为堆内存总量。
堆内存
默认情况下:分配的总内存为电脑内存的1/4,初始化的内存为电脑内存的1/64。OOM(堆内存溢出)解决方案:1.尝试扩大堆内存看结果 2.分析内存,看哪个地方出现问题。
在一个项目中如果出现OOM该怎么排错,研究为什么出错?
可以Dubug一行行分析,但是推荐使用MAT/Jprofiler插件。
OOM查看命令。-Xms设置初始化内存大小,-Xmx最大分配内存(默认为1/4)
MAT/Jprofiler作用:分析Dump文件:快速定位内存泄露。
获取到堆中的数据。
获得大的对象~
GC:垃圾回收机制(作用区为方法区和堆区)。
JVM在GC时,并不是对这三个区域(新生代,幸存代,老年代)进行统一回收。大部分时候回收都是在新生代。幸存区中谁空谁是to,另一个是from
GC两种类型:轻GC和重GC
GC的算法有哪些?标记清除法,标记整理法,复制算法,引用计数法。

引用计数法(下标是使用次数,次数为0的移除),基本不采用这种方法
复制算法:作用于幸存0区和幸存1区,将其实一个幸存区的内存变成0,复制到另一个幸存区去,满足幸存from区和to区概念。新生代主要使用的是复制算法。
默认当一个对象经历了15次GC之后进入老年区。可设置 -XX:MaxTenuringThreshold.

复制算法(好处:没有内存碎片。坏处:浪费内存空间,多了一半空间永远为空)使用的最佳场景为对象存活率较低。
标记清除法:扫描所有对象,对活着的对象进行标记,对死亡的对象进行清除。缺点:严重浪费时间因为要两次扫描,会产生内存碎片 优点:不需要额外的空间。
标记整理法:标记清除的再优化。即在标记清除的基础上再次扫描,将活着的对象移向一端,防止内存碎片的产生。多了一个移动成本
标记清除整理法:先标记清除几次再进行一次整理

没有最优的算法,只有最合适的算法--->GC又叫分代收集算法
浙公网安备 33010602011771号