JVM 类加载 Tomcat

2017-05-07  本文已影响0人  辰晞

到底多少人调试过?好文章


增补:还是一再的在这个问题上面纠缠

参考这里

1:永久区的概念

频繁的GCLib动态生成类就会把这个的确写爆 作者也没有说清楚?

2:内存条件和管理

没有JVM的优化,怎么优化呢?

调优

看到eden是4:1这里,然后1分from,to,就是8:1的。整体1:2这些参数

别人家的调试

调试 调优 调试 调试

一句话,在不同的分代,采用不同的回收算法,年代,多种方式并行等。


实际动手试一试这些demo,体会深入了些,每次都会问到。

大公司都问这个?

就一张图

手工绘制

然后有多少人有实际的调试经验呢?

看到GC过程 参数

加个参数输出GC的日志。

问题补充

1:分代是为了根据特点选择不同的垃圾回收算法。

够了

2:GCRoot 引用计数中的根结点是什么?

这个?

这个就是我们定义 Class a = new Class(); a不就是根结点,谁指向a呢?ClassLoader()等这些。

3:垃圾回收器

串行,并行,并发。关键CMS的并发,肯定是标记清除,CMS线程和工作线程是在一起工作的,你复制,标记整理,移动内存地址,可能导致错误的

4:类加载机制

装载类的第一个阶段--  取得类的二进制流----转为方法区数据结构----在Java堆中生成对应的java.lang.Class对象,findClass,loadClass,defineClass,生成实例对象等。就单独的说这个类加载机制。其实就是这个类:ClassLoader,他是JVM的定制类,本身不需要加载。

这个过程就是“双亲委派”模式

自定义-app-ext-bootstrap 4个

一句话:双亲委托模式,就是在加载类的时候会先查看自己的父类释放加载,如果加载,就返回对象实例,如果没有继续询问,然后尝试从上往下加载,直到我们的自定义类。

为什么这样!避免重复加载!

启动流程

我们的程序加载类的时候就这样。

1:“双亲委托模式”的破坏,重写一下findClass即可。

没用过的场景,为什么要Bug存在,ThreadClassLoader

看加载链的时候,自定义加载类-->AppClassLoader(System ClassLoader 系统加载类)-->ExtClassLoader-->BootstrapClassLoader,左侧获取右侧的加载类很方便,但是,右侧获取不到自定义的加载类可能。这是单向的,为此,你可以把一个ClassLoader设置为 ThreadContextClassLoader这个类。

tomcat源码有很多这种

面试都喜欢这样问,这里说的很清楚。Bootstrap是C++写的二进制代码?

为什么会有这种场景?

大概是这个场景,没有用过 ss.getContextClassLoader().loadClass(className)

不能理解干吗呢?可能读源码能遇到吧。

还真有人深入研究Class的类格式?

Tomcat

1:tomcat的优化,线程池方面,参数和和线程池的参数对应。minSpareThreads="100"   初始化时创建的线程数  maxSpareThreads="500"  一旦创建的线程超过这个值,Tomcat就会关闭不再需要的socket线程  acceptCount="700"    这个对应队列的。Tomcat本身的线程,并发配置,操作系统的限制。Window - 2000  Linux - 1000  单机1000的并发就差不多了。

2:爱奇艺问的问题,大概说一下,这个不了解,tomcat的加载机制。

问题 解答

一个图就说明了这个问题

图解

参考这里  什么是类加载器,就是把class文件加载到我们的JVM中。但是,tomcat的类加载器是不一样的

MS1:Web的类加载器,是“子优先”。为什么要子优先,servlet规定。其次,一个应用使用servlet 2.5,我们的都是,我要部署一个Servlet3.0的应用,如果父优先,那就加载不了。

MS2:Common类加载器,这个建立应用的时候,就看到一下依赖类,就是这Y加载的。

不是很懂,纯粹为了面试仅此。

上一篇 下一篇

猜你喜欢

热点阅读