1.实现软件升级.(热替换)
2.更好的防止内存泄露,提高内存的有效使用率.
3.更好提高系统的吞吐量(可以处理更大的并发)
了解JVM产品
JVM是一个虚拟机规范,基于这个规范有不同的产品,列如:
Oracle 公司HotS
JVM构成:
在JVM规范中,可能有以下:
1.类加载子系统,负责将类读到内存,校检类的合法性,对类进行初始化
2.运行时数据区(负责存储类信息-方法区,对象信息-堆或栈,执行逻辑-栈)
3.执行引擎(负责从指定地址对应的内存中读取数据然后解释执行以及GC操作)
4.本地库接口(负责实现JAVA语言与其他语言之间的协同)
类如何加载?
在JVM类中加载由类加载器负责,她会负责将类从指定
有哪些加载器
- 获取当前类的类加载器(AppClassLoader)
- 获取扩展类的类加载器(ExtClassLoader)
- 获取根类加载器(BootStrapClassLoaer)
- 自定义类加载器,可以指定类加载方式以及扩展类的加载路径(ClasslOADER)
类加载的时机
2.显示加载(ClassLoader.loadClass(.......))
双亲委派模型
向上询问,向下委托;当我们的类被加载时,首先会询问类加载器类对象
类加载基本过程
查找类--------读取类-------------读到字节数组后对字节数组里的内容进行效验分析,存储到方法区-------保存对象---创建字节码对象(java.lang.class)
关于类加载静态块是否执行
关于静态代码块是否执行要看类是处初始化,初始化了静态块就会执行
JVM构成
年轻代,老年代,伊甸园和幸存区
Java对象分配内存的过程是怎样的
编译器逃逸分析(JDK8已默认开启),确定对象是在栈上分配还是在堆上分配
如果是在堆上分配,则首先检测是否可在TLAB(Thread Local Allocation Buffer) 上直接分配
如果在TLAB上无法直接分配则在Eden加锁区进行分配
-********************
如果Eden区无法存储对象,则执行Yongoing GC
如果Yongoing GC之后Eden区仍然不足以存储对象,则直接分配在老年代(当老年代内不能足时就会出现fullgc)
JVM年轻代幸存区设置比较小会有什么问题
伊甸园区对象被回收时,或者对象拷贝到幸存区,假如幸存区比较小,拷贝的对象比较大,对象想可能直接拷贝到老年代.这样会增加老年代GC的频率(老年代触发的GC我们可以简单理解为大GC或fullgc,这个过程非常慢),性能会影响,同时回收的思想就会被弱化
JVM参数
-xms用于设置初始堆大小
-XX?:+DoEscapeAnalysis用于逃逸分析
-XX: +PrintGC输出gc信息
-Xmx128m -Xmx128m -XX:+DoEscapeAnalysis -XX: +PrinGC
JVM中有哪些垃圾回收器
串行(Serial)
并行(Parallel)
并发(CMS)
G1(收集器--逻辑上分代------但是力度会更小)
怎么进行内存调优?
看是因为什么原因需要进行内存调优
如果是因为内存不足发生的,我可以进行设置内存大小来解决,减少GC
如果内存在固定的情况下,我们可以进行判断是否内存发生了泄露,从而判断解决
GC算法
.标记清除算法
标记清除算法应用:----适合活着的对象比较少的内存区域,这样标记的事件就会缩短,也不会产生大量碎片
步骤:
1.会对活着的对象进行标记,
2.扫描内存对未标记的对象进行清除
总共扫描俩次,耗时有点长,标记清除算法可能会长生大量的碎片
比较适合老年代,老年代对象少,这样他的碎片就少了
标记复制算法 -----适合或者的对象比较少的内存区,年轻代
步骤
首先会扫描内存,对活着的对象进行标记,然后将其拷贝一块的内存中,原先的内存释放,适合活着的对象比较少的内存区,年轻代
不是活着的就是垃圾对象,提高了效率
以空间换时间
缺点:
这种算法会牺牲一定的空间(年轻代生命力比较弱)
标记整理算法
步骤:
1.标记活着的对象
2.把活着对象向一侧移动
3.清理便捷外的内存区域
比较适用于老年代
对于JVM中的GC操作要考虑哪些问题
原文地址:https://www.jb51.cc/wenti/3281345.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。