01-004 【jvm】 堆、对象生命周期、堆参数、日志分析调整

以jdk1.8+Hotspot为例

定义

堆(heap):通过new关键字,创建的对象都使用堆内存,堆内存逻辑上分为三部分:新生代+老年代+元空间(java8)/永久代(java7);物理上由新生代+老年代组成。

实际而言,方法区(Method Area)和堆一样,是各个线程共享的内存区域,它用于存储虚拟机加载的:类信息+普通常量+静态常量+编译器编译后的代码等,虽然jvm规范将方法区描述为堆的一个部分,但它却还有一个别名Non-Heap(非堆),目的就是要和堆分开。
对于Hotspot虚拟机,很多开发者习惯将方法区称之为“永久代”或“元空间”,但严格本质上说两者不同,或者说使用永久代来实现方法区而已,永久代是方法区的一个实现。

特点:
①线程共享,要考虑安全问题。
②垃圾回收机制

对象生命周期与GC

堆分为 Eden+S0+S1
S0 = from
S1 = to
from区和to区,它们的位置和身份,不是固定的,每次GC后会交换,GC之后交换,谁空谁是to区
堆内存物理上分为新生+养老
新生代又分为:伊甸园区:from:to = 8:1:1,from和to永远相等
新生占1/3的元空间,养老占2/3的元空间
交换:产生minorGC(轻GC)(复制》清空》交换)

java8优化后很难到永久代
永久区(java7前有)永久存储区是一个常驻内存区域,用于存放JDK自身所携带的Class、Interface的元数据,也就是说它存储的是运行环境必须的类信息,被装载进此区域的数据是不会被垃圾回收器回收掉的,关闭JVM才会释放此区域所占内存。

堆内存诊断

  1. 工具
    ① jps(配置好jdk环境变量,在Idea的Terminal下可执行命令)
    查看系统中有哪些进程 jps
    ② jmap
    查看堆内存占用情况 jmap -heap 进程id
    ③ jconsole(图形界面,连续直观)
    也能监测线程、CPU jconsole
    ④ jvisualvm
    可视化界面
    堆转储
    抓取内存快照

堆参数调整

在这里插入图片描述
java8后的元空间并不在虚拟机中而是使用本机物理内存,因此,默认情况下,元空间的大小受本地内存限制。

参数含义
-Xms设置初始分配大小,默认为物理内存的1/64
-Xmx最大分配内存,默认为物理内存的1/4
-XX:+PrintGCDetails输出详细的GC处理日志

查看

package com.magic.jvm;

public class NativeT2 {
    public static void main(String[] args) {
        System.out.println(Runtime.getRuntime().availableProcessors());
        long maxMemory = Runtime.getRuntime().maxMemory();//最大大小
        long totalMemory = Runtime.getRuntime().totalMemory();//初始大小
        System.out.println("MAX_MEMORY = "+maxMemory+"(字节)、"+(maxMemory/1024/1024)+"MB");
        System.out.println("TOTAL_MEMORY = "+totalMemory+"(字节)、"+(totalMemory/1024/1024)+"MB");
    }
}

内存大时,泄露不容易发现,可能随着时间推移才会暴露出堆内存溢出问题。
生产环境初始值、最大值必须一样,原因如下:避免内存忽高忽低,产生停顿。
heap的结构如下,堆内存逻辑上分为三部分:新生代+老年代+元空间(java8)/永久代(java7);物理上由新生代+老年代组成(PSYoungGen/1024+ParOldGen/1024 = 981M)。
在这里插入图片描述
Full GC 也没有内存会产生
OOM:java.lang.OutOfMemoryError:Java heap space

收集日志信息

-XX:PrintCGDetails开启

"C:\Program Files\Java\jdk1.8.0_211\bin\java.exe" -Xmx10m -Xms10m -XX:+PrintGCDetails 
[GC (Allocation Failure) 
[PSYoungGen: 1525K->504K(2560K)] 1525K->668K(9728K), 0.0018018 secs]
新生代回收前占用内存->新生代回收后占用内存(新生代总分配内存)   回收前占用内存->回收后占用内存(总内存)
[Times: user=0.00 sys=0.00, real=0.00 secs] 
===================================================================================
[名称   GC前内存占用->GC后内存占用(该区域总大小)
[Full GC (Allocation Failure) 
[PSYoungGen: 480K->0K(2560K)] 
[ParOldGen: 236K->590K(7168K)] 716K->590K(9728K), 
[Metaspace: 3059K->3059K(1056768K)], 0.0062830 secs] 
[Times: user=0.11 sys=0.00, real=0.01 secs] 
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
	at com.magic.jvm.NativeT2.main(NativeT2.java:21)
Heap
 PSYoungGen      total 2560K, used 112K [0x00000000ffd00000, 0x0000000100000000, 0x0000000100000000)
  eden space 2048K, 5% used [0x00000000ffd00000,0x00000000ffd1c208,0x00000000fff00000)
  from space 512K, 0% used [0x00000000fff00000,0x00000000fff00000,0x00000000fff80000)
  to   space 512K, 0% used [0x00000000fff80000,0x00000000fff80000,0x0000000100000000)
 ParOldGen       total 7168K, used 573K [0x00000000ff600000, 0x00000000ffd00000, 0x00000000ffd00000)
  object space 7168K, 7% used [0x00000000ff600000,0x00000000ff68f568,0x00000000ffd00000)
 Metaspace       used 3143K, capacity 4496K, committed 4864K, reserved 1056768K
  class space    used 341K, capacity 388K, committed 512K, reserved 1048576K

Process finished with exit code 1

学习整理于解密JVMjvm2019.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值