JVM学习总结

  毕业以来技术上一直没有太大进步,仔细一想可能是没有做技术分享,我喜欢把学习总结记录在印象笔记中,那么理解的是对是错也就没人能评判一下。为了技术进步,接下来将陆续把一些学习总结迁移到博客园中,欢迎大家多多指正!

JVM的定义

Jvm

Java虚拟机。一次编译,到处运行的前提

Jre

JVM+核心类库

Jdk

JVM+核心类库+扩展类库

JMM

Java内存模型。主要用于多线程共享数据

子模块

自动内存管理(分配、回收内存)、虚拟机执行子系统(类加载机制、虚拟机字节码执行引擎)

 

JVM运行时数据区

JVM学习总结

 

JDK8以后:

JVM学习总结

(图摘自java3y)

程序计数器:

当前线程所执行的字节码的行号指示器。

Java虚拟机栈:

Java方法执行的内存模型:每个方法执行时都会创建一个栈帧用于存储局部变量表、操作数栈、动态连接、方法出口等。

本地方法栈:

为虚拟机执行的native方法服务。

Java堆:

存放对象实例。

常量池:常量池记录的是代码出现过的常量、类名、成员变量等以及符号引用(类引用、方法引用,成员变量引用等)。

方法区(元空间):

存储已被虚拟机加载的类元数据信息。

 

内存溢出:

内存不够用。OutOfMemoryError: Java heap space、StackOverFlowError、OutOfMemoryError: Metaspace

内存泄漏:

无用内存未及时回收。最终可能导致内存溢出。

 

示例:

1、各种内存溢出。2、创建String对象时的内存分配

import org.springframework.cglib.proxy.Enhancer; import org.springframework.cglib.proxy.MethodInterceptor; import org.springframework.cglib.proxy.MethodProxy; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; /** * jvm内存溢出示例 * -Xms 堆初始值 * -Xmx 堆最大值 * -Xmn 新生代大小 * -Xss 每个线程的栈大小 * -server -Xmx20m -Xms20m -Xmn10m -Xss1m -XX:+HeapDumpOnOutOfMemoryError * -server -XX:MetaspaceSize=10m -XX:MaxMetaspaceSize=10m -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC */ public class MemErrorDemo { int depth = 0; /** * 内存溢出错误(OOM) */ public void OOMError() { List<byte[]> list = new ArrayList<>(); int i = 0; while (true) { list.add(new byte[5 * 1024 * 1024]); System.out.println("loop count: " + (++i)); } } /** * 栈溢出错误(StackOverFlowError) */ public void SOFError() { try { depth++; SOFError(); } finally { System.out.println("递归count: " + depth); } } /** * 元空间错误 * 使用cglib生成动态代理类 */ public void MetaSpaceError() { int i = 0; try { while (true) { i++; Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(OOMObject.class); enhancer.setUseCache(false); enhancer.setCallback(new MethodInterceptor() { public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { return proxy.invokeSuper(obj, args); } }); enhancer.create(); } } catch (Exception e) { System.out.println("generate class count" + i); e.printStackTrace(); } } static class OOMObject { } public static void main(String args[]) { MemErrorDemo memErrorDemo = new MemErrorDemo(); //memErrorDemo.OOMError(); //memErrorDemo.SOFError(); memErrorDemo.MetaSpaceError(); } }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpyfjd.html