jvm的个人经验总结

指令与数据分离:
    JVM是虚拟机,也是一种规范,他遵循着冯·诺依曼体系结构的设计原理。冯·诺依曼体系结构中,指出计算机处理的数据和指令都是二进制数,采用存储程序方式不加区分的存储在同一个存储器里,并且顺序执行,指令由操作码和地址码组成,操作码决定了操作类型和所操作的数的数字类型,地址码则指出地址码和操作数。

1:java文件执行步骤:

数据区:大约可分为堆、本地方法区
指令区:程序计数器、虚拟机栈、本地方法栈

 2 方法进栈的流程:线程会把方法压进栈,然后初始化参数到局部变量表中,然后执行指令并放回地址。

 

3 内存管理与参数设置:

-Xmx:表示JVM最大堆内存大小

-Xms:表示JVM初始化内存大小

-XX:MaxNewSize:表示年轻最大值

-XX:MaxPermSize:表示持久代最大值

首先我会把-xmx最大堆内存(新生代(xmn)+老年代+持久代) 和-xms的数值调成一样,这样避免jvm内存自动扩展,如果程序抛出内存溢出,这样就可以从内存泄漏和内存溢出查找原因。-XX:MaxPermSize最大方法区内存溢出异常,因为用cglib或者大量的动态生成的类很多,所以保证所有的class有内存可以被加载,方法区内存溢出也很常见。

 

4 类加载器与执行引擎

bootstrap class loader:它用来加载 Java 的核心库(jre/lib/rt.jar)。

extensions class loader:它用来加载 Java 的扩展库(jre/ext/*.jar)。

system class loader:它根据 Java 应用的类路径(CLASSPATH)来加载 Java 类。

custom class loader:加载自定义java类。

双亲委派机制:某个特定的类加载器在接到加载类的请求时,首先将加载任务委托交给父类加载器,父类加载器又将加载任务向上委托,直到最父类加载器,如果最父类加载器可以完成类加载任务,就成功返回,如果不行就向下传递委托任务,由其子类加载器进行加载。

双亲委派机制好处:保证java核心库的安全性(例如:如果用户自己写了一个java.lang.String类就会因为双亲委派机制不能被加载,不会破坏原生的String类的加载)

5 垃圾回收

垃圾回收主要做两件事:1标记此对象为无用对象2回收已经被标记为无用的对象

Minor GC

一般情况下,当新对象生成,并且在Eden申请空间失败时,就会触发Minor GC,对Eden区域进行GC,清除非存活对象,并且把尚且存活的对象移动到Survivor区。然后整理Survivor的两个区。这种方式的GC是对年轻代的Eden区进行,不会影响到年老代。因为大部分对象都是从Eden区开始的,同时Eden区不会分配的很大,所以Eden区的GC会频繁进行。因而,一般在这里需要使用速度快、效率高的算法,使Eden去能尽快空闲出来。

Full GC

对整个堆进行整理,包括Young、Tenured和Perm。Full GC因为需要对整个对进行回收,所以比Full GC要慢,因此应该尽可能减少Full GC的次数。在对JVM调优的过程中,很大一部分工作就是对于Full GC的调节。有如下原因可能导致Full GC:

 年老代(Tenured)被写满

持久代(Perm)被写满

System.gc()被显示调用

上一次GC之后Heap的各域分配策略动态变化

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值