到底多少人调试过?好文章
增补:还是一再的在这个问题上面纠缠
1:永久区的概念


2:内存条件和管理
没有JVM的优化,怎么优化呢?

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




一句话,在不同的分代,采用不同的回收算法,年代,多种方式并行等。
实际动手试一试这些demo,体会深入了些,每次都会问到。
就一张图

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


加个参数输出GC的日志。
问题补充
1:分代是为了根据特点选择不同的垃圾回收算法。

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

这个就是我们定义 Class a = new Class(); a不就是根结点,谁指向a呢?ClassLoader()等这些。
3:垃圾回收器
串行,并行,并发。关键CMS的并发,肯定是标记清除,CMS线程和工作线程是在一起工作的,你复制,标记整理,移动内存地址,可能导致错误的。
4:类加载机制
装载类的第一个阶段-- 取得类的二进制流----转为方法区数据结构----在Java堆中生成对应的java.lang.Class对象,findClass,loadClass,defineClass,生成实例对象等。就单独的说这个类加载机制。其实就是这个类:ClassLoader,他是JVM的定制类,本身不需要加载。

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

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

我们的程序加载类的时候就这样。
1:“双亲委托模式”的破坏,重写一下findClass即可。
没用过的场景,为什么要Bug存在,ThreadClassLoader
看加载链的时候,自定义加载类-->AppClassLoader(System ClassLoader 系统加载类)-->ExtClassLoader-->BootstrapClassLoader,左侧获取右侧的加载类很方便,但是,右侧获取不到自定义的加载类可能。这是单向的,为此,你可以把一个ClassLoader设置为 ThreadContextClassLoader这个类。
面试都喜欢这样问,这里说的很清楚。Bootstrap是C++写的二进制代码?
为什么会有这种场景?


不能理解干吗呢?可能读源码能遇到吧。
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加载的。
不是很懂,纯粹为了面试仅此。
网友评论