从头开始学JVM
小大宇
能与优秀的人为伍自然就会变优秀
展开
-
从头开始学JVM--------理解GC日志
一、需要掌握的虚拟机参数堆内存命令 -Xms 设置堆最小内存 -Xmx 设置堆最大内存栈内存命令 -Xss 设置每个线程的栈内存GC -XX:+HeapDumpOnOutOfMemoryError 分析堆内存溢出原因 -XX:+HeapDumpPath=/user/local/ 将堆内...原创 2019-08-22 16:03:00 · 308 阅读 · 0 评论 -
JVM参数增加OOM事件
以部署在linux系统/opt/Server目录下的Server.jar为例1.在run.sh启动脚本中添加jvm参数:-XX:OnOutOfMemoryError=/opt/Server/restart.sh2.restart.sh脚本linux环境:#!/bin/bashpid=$(ps -ef|grep Server.jar|awk '{if($8=="java") {print $2}}')kill -9 $pidcd /opt/Server/;sh run.shWin原创 2022-02-09 13:43:28 · 787 阅读 · 0 评论 -
最近OOM感悟
近期工作上真的到处都在遇到OOM。Kafka查询出现OOM原因:一次查询创建了太多consumer对象。解决方案:Consumer对象存放到ThreadLocal中复用,并在请求结束后调用 consumer#unsubscribe consumer#close 方法关闭Consumer对象,释放内存。业务上出现OOM使用我们JAR包的十几个应用的内存都达到了惊人的6G。显然根据他们实际的业务评估,根本不可能出现如此严重的内存消耗。经过我的排查,主要代码中出现了两处严重的内存泄露。①存原创 2022-01-26 11:10:25 · 1741 阅读 · 0 评论 -
从头开始学JVM--------内存管理
一、基本内存分布 堆内存:堆内存是所有线程共享的一块内存区域,由虚拟机在启动的时候创建。唯一目的就是存放对象实例,几乎所有对象实例都在堆里分配内存。数组也在这里分配内存。这里也是垃圾回收器工作的主要区域。 栈内存:栈内存存储基本数据类型,方法引用以及方法里面的临时变量。 方法区:用于存储已被虚拟机加载的类信息、静态变量等数据,还有就是常量...原创 2019-08-14 16:36:09 · 315 阅读 · 0 评论 -
从头开始学JVM--------Java类加载
一、类加载 在加载阶段,虚拟机需要完成三件事。(1)通过类全限定名,获取此类的二进制字节流。(2)将此字节流加载进方法区。(3)在Java堆中生成一个此类的java.lang.Class对象,作为方法区这些数据的访问入口。二、强制类初始化 用new关键字 调用一个类的静态成员(不包括使用final修饰的常量,因为常量在编译阶...原创 2019-08-20 10:46:56 · 233 阅读 · 0 评论 -
从头开始学JVM--------垃圾回收
一、新生代,老年代,永久代 新生代:主要是用来存放新生的对象。如果出现频繁创建对象,那么这些对象会放入新生代。 新生代主要分别为 Eden区与Survivor区 老年代:主要存放应用程序中生命周期长的内存对象。 永久代:主要存放Class类的信息。可以粗略理解永久代就是方法区。GC一般不会在运行期间...原创 2019-08-15 15:37:56 · 280 阅读 · 0 评论