1 概念
java virtual machine为java虚拟机,运行使用jdk中编译器编译的java程序。
2 JVM内存模型
程序计数器:线程私有。当前线程正在执行的行号指示器。
Java虚拟机栈:线程私有。即将运行的java方法创建的区域。
本地方法栈:线程私有。即将运行的本地方法创建的区域。
堆:线程共享,存放对象。
方法区:线程共享。存放加载的,类、常量、静态变量、即时编译器编译后的代码。
线程私有:生命周期和所属线程一样。
线程共享:jvm启动时创建,停止时销毁时
3 类加载过程
延伸:
类显示加载
类隐示加载
4 老生代和新生代
4.1 堆内存=老生代+新生代+持久代
老生代:存放生命周期比较长的对象。gc经过多次垃圾回收没有被回收的对象或者大对象。
新生代:存放新生成的对象。
4.2 各个内存分配
持久代一般固定为64M,新生代一般占据堆内存1/3,老生代为(堆内存-新生代内存-持久代内存)
5 如何设置jvm堆内存
5.1 idea设置jvm堆内存
找到idea的bin目录
确定jdk版本,根据版本选择不同的配置文件。
修改配置:idea.exe.vmoptions、idea64.exe.vmoptions
5.2 linux设置jvm堆内存
设置环境变量/etc/profile JAVA_OPTIONS
-Xms 堆内存初始分配值,默认为物理内存的1/64
-Xmx 堆内存最大值,默认为物理内存的1/4
-Xmn 新生代内存最大值
6 jvm问题排查
jstack:用于打印指定的java进程ID或core file 或远程调试服务的java堆栈信息
jmap:生成dump文件,查询finalize执行队列,java堆和永久代的详细信息,如当前使用率,当前使用的收集器等。
参考文档:《深入Java虚拟机(原书第2版).pdf》
如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!