注:为什么会有自定义类加载器?
一方面是由于java代码很容易被反编译,如果需要对自己的代码加密的话,可以对编译后的代码进行加密,然后再通过实现自己的自定义类加载器进行解密,最后再加载。
另一方面也有可能从非标准的来源加载代码,比如从网络来源,那就需要自己实现一个类加载器,从指定源进行加载。
堆和栈的区别
堆的物理地址分配对对象是不连续的。性能慢;栈使用的是数据结构中的栈,先进后出,物理地址分配是连续的。性能快。堆存放的是对象的实例和数组;
垃圾回收有分代复制垃圾回收、标记垃圾回收、增量垃圾回收。
说一下 JVM 调优的工具?
监控工具,位于 JDK 的 bin 目录下,有 jconsole 和 jvisualvm。jconsole:用于对 JVM 中的内存、线程和类进行监控;jvisualvm:因为他是那个JDK 自带的,可以分析:内存快照、线程快照、gc 变化等。
常用的 JVM 调优的参数都有哪些?
-Xms2g:初始化堆大小为 2g;
-Xmx2g:堆最大内存为 2g;
–XX:+UseParNewGC:使用 ParNew + Serial Old 垃圾回收器;
-XX:+UseParallelOldGC:使用 ParNew + ParNew Old 垃圾回收器;
-XX:+PrintGC:打印 gc 信息;
-XX:+PrintGCDetails:打印 gc 详细信息。