首页
题库
公司真题
专项练习
面试题库
在线编程
面试
面试经验
AI 模拟面试
简历
求职
学习
基础学习课
实战项目课
求职辅导课
专栏&文章
竞赛
搜索
我要招人
发布职位
发布职位、邀约牛人
更多企业解决方案
AI面试、笔试、校招、雇品
HR免费试用AI面试
最新面试提效必备
登录
/
注册
苦海浮沉孽缘生
2017-03-14 22:56
已编辑
保定学院 Java
关注
已关注
取消关注
快速掌握JVM,小弟5篇总结的博客
http://blog.csdn.net/qq_25235807/article/details/61920877
#Java工程师#
提示
全部评论
推荐
最新
楼层
苦海浮沉孽缘生
楼主
保定学院 Java
堆内存调整参数(调优的关键) 通过以上两篇的文章我们可以发现每一个区域都有一个可变的伸缩区,当我们的内存空间不足的时候,会在可变的范围内扩大内存空间,当我们的内存空间变得不紧张的时候我们再释放可变空间。 在堆内存的调优之中我们要特别注意两个参数-Xms初始化内存分配大小,默认为物理内存的1/64,-Xmx 最大的分配内存默认为物理内存的1/4。 以本人8G电脑来说: class GCDemo { public static void main(String[] args) { Runtime run =Runtime.getRuntime(); long maxMemory =run.maxMemory(); long totalMemory =run.totalMemory(); System.out.println("总内存"+(maxMemory/(double)1024/1024)+"M"); System.out.println("可用内存"+(totalMemory/(double)1024/1024)+"M"); } } 1 2 3 4 5 6 7 8 9 10 11 1 2 3 4 5 6 7 8 9 10 11 输出GC的处理日志: 那么现在的可调整内存空间(伸缩区)就在123M-1810M之间,这样可能造成程序的性能下降,所以我们将初始内存空间和最大的内存空间设置为相等。就避免了伸缩区的可调策略。从而提升程序的性能。 输出GC的处理日志: 可以看出调整后的堆内存的每个区域都比以前大了,此时没有可伸缩的区域,而且也解释了前面的问题,老年代的内存空间是最大的,而两个存活的内存一定是相等的。 年轻代参数调整 所有使用关键字new新实例化的对象一定会在伊甸园区进行保存,而对于存活区保存的一定是已经在伊甸园区中存在好久,并且经过了好几次的Minor GC还保存下来的活跃对象。那么这个对象将晋升到存活区之中,存活区一定会有两块空间,这两块空间的大小一定是相等的,目的:一块存活区为了晋升、另外一块存活区为了对象回收。这两块内存空间一定有一块是空的。在年轻代中使用的是Minor GC,这种GC算法采用的是复制算法。 Minor GC 实现算法: 首先扫面伊甸园区中的存活对象,其中有活跃对象和不活跃对象。此时会将活跃的对象晋升到其两个存活区中的那个空的存活去中而另一个存活区中的活跃对象也会复制到这个存活区,如果该存活区还有不活跃对象会晋升到老年代中。以保证必须有一个空的存活区这时伊甸园会产生新的空间,保存新的对象。 通过以上分析会发现伊甸园区中保存的对象大部分可能是临时对象,那么这就会频繁的发生Minor GC,所以HotSpot为了加快此空间的分配操作,采用了两种技术。 Bump-The-Pointer 该技术采用栈的形式,每一个最后保存的对象一般都会保存在伊甸园区的顶部,这样的话只要每创建一个新的对象我们就只需要检查保存对象后面是否有新的空间即可。 TLAB Bump-The-Pointer虽然提高了内存的分配速度但是如果是多个线程同时保存一个对象那?显然是不适合的所以TLAB算法又将伊甸园区分为多个数据块,每个数据块使用Bump-The-Pointer进行对象的保存和分配。 老年代参数调整 老年代主要是接收由年轻代发送来的对象,一般情况下经过了好几次的Minor GC之后还会保存下来的对象才会进入到老年代。如果你要保存的对象超过了伊甸园区的大小,那么此对象也将直接保存到老年代之中。当老年代内存不足时将引发“Full GC在老年代里面会采用两种算法结合的模式实现GC的处理:整理-压缩。 标记-清除 在活跃对象较多时比较高效,但是由于该算法直接回收内存对象会造成内存的碎片化这也是最头疼的问题。 标记-压缩 在标记-清除的基础上进行对象的移动,成本较高,但是不产生碎片。类似于电脑的磁盘管理。 永久代参数调整 虽然jdk1.8中没有永久代但是javaEE目前依然是1.7 元空间参数调整 总结 1、JDK 1.8中的内存分为:年轻代、老年代、元空间; 2、年轻代有两个组成部分:伊甸园区、两个存活区,GC回收策略为“复制”; 3、老年代的保存空间一般较大,使用的是“整理-压缩”GC回收策略。 4、JDK 1.8之前存在有永久代; 面试题: 一般什么时候会发生GC?如何处理? Java中的GC会有两种回收:年轻代的Minor GC,另外一个就是老年代的Full GC;新对象创建时如果伊甸园空间不足会触发 MinorGC,如果此时老年代的内存空间不足会触发Full GC,如果空间都不足抛出OutOfM emoryError 。 面试题: 如果整个Java项目运行缓慢,你该如何解决? 避免堆内存的伸缩空间进行操作,将初始化内存空间与整体堆内存空间大小设置为一一样,使用“-Xms”、“-Xmx” 面试题: 当一个对象非常大的时候,请问是如何保存的? 该对象将直接保存在老年代。
点赞
回复
分享
发布于 2017-03-14 21:41
苦海浮沉孽缘生
楼主
保定学院 Java
Java具备良好的垃圾收集特性,也就是GC是整个Java之中的最重要的安全保证,它可以保证即使再蠢的开发者也能够写合理的代码来。整个JVM中的GC的处理机制:对不需要的对象进行标记,而后进行清除. java堆内存模型 JDK1.7以前 JDK1.8 JDK 1.8之后将最初的永久代内存空间取消了为了将HotSpot与JRockit两个虚拟机标准联合为一个. 新生代:新的对象和没有达到一定“年龄”的对象对象存放空间(活跃对象) 老年代:被长时间使用的对象,老年代空间要相对较大 元空间:一些操作的临时对象,如方法中的临时对象,直接使用物理内存 注意:永久代和元空间都是存放临时对象的,但是永久代使用的是JVM直接分配的内存,而元空间使用的是物理内存 GC的流程(非常重要) java所有的数据都会保存在JVM的堆内存之中,但是在实际的开发之中经常会创建许多的临时对象,也会有一些常驻对象存在,所以为了保证GC的性能,就要进行垃圾回收。 GC的处理流程 注意:在整个GC的流程之中是 针对新生代和老年代进行内存清理的操作,而元空间和永久代都不在GC的范围之内。 重要: 1. 当新创建一个对象的时候,那么对象一定需要在堆内存中分配内存空间。所以就需要对该对象申请内存空间 2. 首先会判断Eden区中是否有充足的内存空间,如果有,那么直接将对象保存在Eden区中 3. 如果此时Eden中内存空间不足,那么会自动执行一个Minor GC的操作,将伊甸园区的无用的内存空间进行清理,清理之后 继续判断伊甸园区的内存空间是否充足。如果充足,那么将对象直接在疑点园区中进行内存分配。 4. 如果执行了MinorGC之后发现伊甸园区的内存依然不足,则会对存活区进行判断,如果存活区内存足够。那么将伊甸园区的 一部分活跃对象保存到存活区,随后继续判断伊甸园区内存,如果够进行新对象的内存分配。 5. 如果此时存活区没有足够的内存空间,则继续判断老年区。如果老年区的内存空间充足,则将存活的部分活跃对象保存到 老年代,而后存活区会出现剩余空间。随后将伊甸园区的活跃对象保存对象, 然后在伊甸园区开辟空间,保存新对象。 6. 如果此时老年代也没有剩余空间,则执行MajorGC(FullGC),清理老年代内存 7. 如果执行了FullGC之后依然无法保存对象,就会产生OOM异常“OutofMemoryError”。 解释的是:StackOverError是由于栈的深度过大由和栈帧有关的异常,请看第一篇。而OutofMemoryError是由于堆内存引起的。
点赞
回复
分享
发布于 2017-03-14 21:41
苦海浮沉孽缘生
楼主
保定学院 Java
java程序的运行流程 众所周知所有的Java程序代码必须保存在.java的文件之中,这些称为源代码。而这些源代码并不能够直接执行,必须使用javac.exe命令将其编译为.class文件,而后利用java.exe命令在JVM进程之中解释此程序。 实际上当JVM将所需要的*.class文件加载到JVM进程之中,那么这个过程就需要有一个类加载器(ClassLoader),有了类加载器的好处在于:可以随意指定程序 .class文件的所在路径。 类加载器概念 JVM:Java虚拟机,所有的程序都要求运行在JVM上,是因为考虑到了可移植性问题,可是如果要想真正去执行程序,你绝对不可能离开操作系统的支持。 在Java里面可以使用native实现本地C函数的调用。但是这些都属于程序运行的辅助手段,而真正的程序运行都在“运行时数据区”之中。 运行时数据区 运行时数据区由以下几个部分组成: 堆内存:保存所有引用数据类型的真实信息 栈内存:基本类型,运算,指向堆内存的指针 方法区:所有定义方法信息,属于共享区 程序计数器:是一个很小的内存空间,用于执行下个执行的代码 本地方法栈:每一次执行递归的方法处理都会将上一个方法入栈 栈 栈内存是线程私有的,栈的生命周期和线程相同;栈描述的是java方法执行的内存模型,执行一个方法的时候会产生一个栈帧,随后将其保存到栈顶,方法执行完毕自动出栈。顶部的栈帧表示的是当前的方法;注意的是如果栈的深度过大。如递归过深虚拟机会抛出StackOverError。如果虚拟机允许栈动态扩展内存不足时抛出OutOfMemoryError. 栈帧 局部变量表:方法的局部变量或形参 操作数栈:表达式的计算 方法所属类的运行时常量池常量池的引用:引用其他类常量或者字 符 串常量池的字符串 方法返回地址:方法执行完后需要返回调用该方法的位置,所以要在栈帧中保存方法的返回地址 关于常量池的简单介绍 在整个Java之中存在有对象池的概念,对象池是对整个常量池的一个规则破坏,因为在JVM启动的时候所有的常量都已经分配好内存空间了,但是String中的intern()方法却可以打破这种限制,动态的进行常量池的内容设置 对象的访问模式 Obiect obj=new Object();为例 Obiect obj 保存在栈内存中,有对应的堆内存引用 new Object() 一个真的对象保存在堆内存中 引用操作 新定义的的对象名称保存在本地变量表中,而后在这块区域确定与之对应的栈空间通过栈地址找到堆内存,利用堆内存对象调用本地方法。 实际上所有的引用数据类型的访问有两种模式:一是通过句柄访问,一是通过对象指针直接访问。但是在Java之中它直接利用的是对象保存模式,也就是说堆内存里面不再需要保存句柄,而直接保存具体的对象。就相当于省略了句柄到对象间的查找。而后这个对象可以直接进行Java方法区的调用。 通过直接指针访问–HotSpot虚拟机(jvm) 引用数据类型在HotSpot中都是直接进行的引用处理,没有句柄池的概念。
点赞
回复
分享
发布于 2017-03-14 21:40
向宇同桌
牛客网创始人
辛苦***帮忙粘帖过来吧:)
点赞
回复
分享
发布于 2017-03-14 20:48
暂无评论,快来抢首评~
相关推荐
12-29 12:01
门头沟学院 Java
求支招
本人现在的情况:我的第一份实习,也是现在在干的实习,是在懂车帝。十一月中旬入职的,中途请了差不多半个月工作日的假回学校考试(base和学校位置差太远,因为当时准备的晚,十月多才投递,广东这边真的不太好找),然后算了一下减去剩余的假期,到二月底,其实也就是两个月多点(如果加上请假那些天数勉强能凑个三月)。但是现在的情况是听说暑期实习基本3月就要开始投递了,有没有有经验的uu指导下现在应该做什么?我是打算再做一个ai agent的项目,然后偷点实习那边的东西,重新回顾一下八股和算法。另外,因为在这边干的是go,但我还是打算继续投java,要不要准备一些go的面试问题呢?感觉时间特别的赶,因为算了一...
点赞
评论
收藏
分享
12-29 16:48
美的集团_后端开发工程师(准入职员工)
美的内推,美的内推码
🏢美的总部十分现代化,设计水平很高。办公楼和美术馆ALSO连成一片,工作休闲两不误。 ⏰美的下班时间就是和网传的6:20相差不大,部门间会有出入,过了六点半老板就会来催下班了。 🍽️总部食堂提供了几十种的选择,中餐西餐自助餐🍴,粤菜川菜湘菜🌶️样样俱全,个人最推荐的还是粤式烧味,在顺德这个地方就没有不好吃的白切鸡和烧鸭。 🏋️总部园区里还有两个健身房(08空间员工专属和ALSO的商业健身房),器械又新又全,但下班时间人会比较多。08空间健身房还搭配了理疗师,可以花外面1/3的价格享受各种理疗服务。世界五百强-美的集团2026届校园招聘启动啦【企业介绍】集智能家居、楼宇科技、工业技术、...
美的集团公司福利 819人发布
点赞
评论
收藏
分享
11-22 20:58
已编辑
门头沟学院 Java
好一个傻13的hr
Bos上面的很多hr真是傻得,她主动联系我要简历,我说钱太少了,然后就说我经验不行,你主动联系我的好不好,技术在北京这点钱还要硕士,你这个态度,招个毛线🧶
写不来代码的小黑:
北京 硕士 8-10k,这是怎么组合到一起的,纯纯黑奴啊
秋招吐槽大会
点赞
评论
收藏
分享
11-19 18:44
已编辑
成都理工大学 Java
27届acm银牌退役选手找不到实习
有没有佬锐评一下简历编写,boos投简历都很少有回复,有没有佬介绍一下
程序员花海:
我面试过100+校招生,大厂后端面试不看ACM,竞赛经历含金量低于你有几份大厂实习 这个简历整体来看不错 可以海投
如何写一份好简历
点赞
评论
收藏
分享
12-29 12:13
阿里巴巴_淘宝闪购_研发工程师JAVA(准入职员工)
大四双非水产专业上岸阿里后端(五)
小骑手是如何在暑期实习里面,以双非学历横向竞争过组内几位92的实习生,杀出重围成功拿到阿里offer的?上篇篇幅有限所有另开一帖详细分享一下小骑手的实习转正述职文档和答辩心得。因为需要转正答辩,小骑手在阿里最大的收获其实是学会了如何述职如何写产出。对于实习,不干活只思考都比只思考不干活要好!实习期间每个人都会有自己1v1的师兄带着熟悉,安排的需求也都是以一个模块作为切入点深入后进行展开的,师兄与ld其实都素不相识,不会偏袒某个人,给他安排更有挑战的活或者产出多的活,所以每个实习生实际上干的活并不会相差太多,没有那么CRUD但也不会太过复杂。那么在有限的需求里,转正答辩文档要怎么去构建和丰富?小...
夭要7夜宵:
我的神,god 骑手哥
投递阿里巴巴等公司7个岗位
点赞
评论
收藏
分享
评论
点赞成功,聊一聊 >
点赞
收藏
分享
评论
提到的真题
返回内容
招聘动态
查看更多
平安产险
全站热榜
更多
1
...
大四双非水产专业上岸阿里后端(五)
1.2W
2
...
双非本秋招总结
6077
3
...
打工的这一年
4796
4
...
实习两周遭劝退,隔天就招新人,合理吗?
4749
5
...
适可而止吧!你就是“烂泥”
4622
6
...
无语到一定地步是会笑的
4613
7
...
我的世界观,就是对抗优绩主义的武器
3954
8
...
没人带+同事冷漠,真的会内耗
3859
9
...
实习被“放养”零产出,该及时止损还是继续苟着?
3729
10
...
金丹后期牛友!我们新年再见
3315
创作者周榜
更多
正在热议
更多
#
对2025年忏悔
#
2906次浏览
87人参与
#
运营来爆料
#
72381次浏览
454人参与
#
实习没人带,苟住还是跑路?
#
9681次浏览
225人参与
#
腾讯音乐求职进展汇总
#
145494次浏览
1039人参与
#
元旦假期你打算怎么过
#
6409次浏览
159人参与
#
春招前还要继续实习吗?
#
2767次浏览
47人参与
#
面试官问过你最刁钻的问题是什么?
#
7234次浏览
86人参与
#
领导秒批的请假话术
#
30265次浏览
120人参与
#
一人说一家双休的公司
#
5668次浏览
87人参与
#
大家实习都在做什么?
#
7588次浏览
82人参与
#
我们是不是被“优绩主义”绑架了?
#
8069次浏览
276人参与
#
阿里求职进展汇总
#
443831次浏览
3919人参与
#
如何提高实习转正率?
#
72980次浏览
463人参与
#
电网笔面经互助
#
56851次浏览
470人参与
#
实习教会我的事
#
47609次浏览
356人参与
#
牛客2025仙途报告
#
34011次浏览
463人参与
#
新年的第一句祝福
#
50669次浏览
374人参与
#
毕业论文怎么查AI率
#
70196次浏览
1941人参与
#
腾讯工作体验
#
548128次浏览
3658人参与
#
实习期间如何提升留用概率?
#
217611次浏览
1729人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务