刚刚工作,工作中慢慢懂得自己知道的真的是沧海一粟,并且深感书到用时方恨少。平时也比较忙,一些知识点的也记录在自己的本子上,整理的也比较难。想了想还是尽量写到自己的博客上吧,以便自己随时翻阅。---2019/11/21
几周前维护的开发环境的机子,由于没有机子做测试,就把两台机子的应用合并到一台机子上了,打了tar包,做了应用迁移。
那天下班前作的迁移,应用正常都在。第二天上班发现,ssh,挂了上不去了,有开着telnet 也用不了了。没办法只能去重启机子,重开服务,以为是ssh版本问题,没太在意,没过多久,测试又说机子上不去。检查了机子ssh版本,发现没什么不对。用
ps aux | head -1 ; ps aux | sort -rn +3 | head -10 看了下java 内存占用情况。发现内存基本都没了。
应用迁移忘了,改小java 的堆容量,于是乎就改了启动脚本 重新分配了堆的大小。(改成了1G :-Xmx1.5G -Xms1.5G)
最后又想起来自己jvm这一块的知识比较薄弱于是翻书,看博客,看文档。补了点jvm的知识。算是比较大概的了解jvm。
现在抽时间做做笔记:
jvm 内存分类
线程私有:pc程序计数器,jvm虚拟机栈,本地方法栈
线程公有:堆,方法区
补充 : 直接内存(direct)又称堆外内存,不在jvm中,常由于NiO 创建的直接缓冲区(DirectByteBuffer),直接缓冲区,能避免io操作时数据的堆内外复制的过程,能提升系统性能;
jvm中的内存分配策略
堆的分区:新生代 老年代
其中新生代又细分为:eden区 servier区
新对象优先分配在eden区,大对象直接进去老年代。(大对象指 大的数组对象,很长的Stirng,大对象的阈值可以通过jvm参数指定)
eden 区每次发生一次 Mintor GC 对象年龄 +1 ,当对象年龄到达一定值 一般是5岁则从eden 进去servier区
servier 区有动态年龄判断机制,可以把符合条件的对象进入老年代
动态判断年龄机制: 在servier区某一个年龄段(X)的对象的数量>=servier区对象数量的一半时,则大于该年龄段(X)的对象进去老年代。
内存分配保证机制:假如新生代满了,后续对象直接进入老年代。
GC算法:
标记-清除法、未完待续~20191122