JVM探索

运行时数据区域

在这里插入图片描述

双亲委派机制

Bootstrap classLoader

主要负责加载核心的类库(java.lang.*等),构造ExtClassLoader和APPClassLoader。
包:jre\lib\rt.jar

ExtClassLoader

主要负责加载jre/lib/ext目录下的一些扩展的jar。
包:jre\lib\ext

AppClassLoader

主要负责加载应用程序的主函数类

执行流程

在这里插入图片描述

1、类加载收到类加载的请求
2、将这个类请求向上委托给父类加载器去完成,一直向上委托,直到启动类加载器
3、启动类加载器检查是否能够加载当前类,能加载结束,否则抛出异常,通知子加载器进行加载
4、重复步骤
5、没有任何加载器能加载,就会抛出ClassNotFoundException

native

native 即 JNI,Java Native Interface
native 是用做java 和其他语言(如c++)进行协作时用的
也就是native 后的函数的实现不是用java写的

方法区

存放:static、 final、Class 、常量池

静态变量、常量、类信息(构造方法、接口定义),运行时的常量池存在方法区中,但是实例变量存在堆内存中,和方法区无关

特点:先进后出、后进先出
存放: 8大基本类型、对象的引用、实例的方法

队列

先进先出(FIFO)

heap,一个JVM只会存在一个堆内存,堆内存的大小可以调节的
在这里插入图片描述
注:
1、To Survivor区是空的(作为保留区域)
2、jdk8中移除了永久带以后的内存结构

设置JVM内存的参数有四个:
-Xmx Java Heap最大值,默认值为物理内存的1/4,最佳设值应该视物理内存大小及计算机内其他内存开销而定;
-Xms Java Heap初始值,Server端JVM最好将-Xms和-Xmx设为相同值,开发测试机JVM可以保留默认值;默认值为物理内存的1/64
-Xmn Java Heap Young区大小,不熟悉最好保留默认值;
-Xss 每个线程的Stack大小,不熟悉最好保留默认值;
-XX:SurvivorRatio 用来设置新生代中eden空间和from/to空间的比例.
含以-XX:SurvivorRatio=eden/from=den/to
-XX:NewRatio 新生代和老年代的比例(年轻代和年老代默认的比例(1:2)):-XX:NewRatio=老年代/新生代

注:为了防止垃圾收集器在最小、最大之间收缩堆而产生额外的时间,通常把最大(Xmx )、最小()设置为相同的值;
在这里插入图片描述

//返回虚拟机最大可用内存,对应-Xmx(默认值为物理内存的1/4) Runtime.getRuntime().maxMemory(Xms );

//当前JVM空闲内存
Runtime.getRuntime().freeMemory();

//返回jvm初始化的总内存
//当前JVM占用的内存总数,其值相当于当前JVM已使用的内存及freeMemory()的总和
Runtime.getRuntime().totalMemory();

OOM解决方法:
1、尝试加大堆内存看结果
-	-Xms 1024m -Xmx 1024m -XX : +PrintGCDetails
2、分析内存,看一下那个地方出现了问题
(专业工具:Jprofile、jvisualvm(jdk自带的))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值