大数据面试题(十)
556.用Java怎么实现有每天有1亿条记录的DB储存?MySQL上亿记录数据量的数据库如何设计?
1.这么大数据量首先建议 使用大数据的DB,可以用spring batch 来做类似这样的处理。定量向DB存储数据。如果需要定时,可以考虑 quartz。
Mysql数据库设计:
1.读写分离;
2.纵向横向拆分库、表。
MySQL的基本功能中包括replication(复制)功能。所谓replication,就是确定master以及与之同步的slave服务器,再加上slave将master中写入的内容polling过来更新自身内容的功能。这样slave就是master的replica(复制品)。这样就可以准备多台内容相同的服务器。
通过master和salve的replication,准备好多台服务器之后,让应用程序服务器通过负载均衡器去处理查询slave。这样就能将查询分散到多台服务器上。
应用程序实现上应该只把select等读取之类的查询发送给负载均衡器,而更新应当直接发送给master。要是在slave上执行更新操作,slave和master的内容就无法同步。MySQL会检测到master和slave之间内容差异,并停止replication,这回导致系统故障。Slave可以采用LVS(linux系统自带的负载均衡器)实现查询的负载均衡。
使用MySQL的replication是利用的冗余化,实现冗余化需要实现的最小服务器数量是4台,三台slave和一台master,slave为什么是需要三台呢,比如一台slave死机了,现在需要修复再次上线,那么意味着你必须停止一台slave来复制MySQL的数据,如果只有两台slave,一台坏了,你就必须停止服务,如果有三台,坏了一台,你复制数据时停止一台,还有一台可以运维。
对于数据的处理是能放入到内存中就尽量放入到内存中如果不能放入到内存中,可以利用MySQL的Partitioning。
Partitioning就是表分割也就是讲A表和B表放在不同的服务器上。简单来说,Partitioning就是充分利用局部性进行分割,提高缓存利用效率,从而实现Partitioning的效果。其中最重要的一点就是以Partitioning为前提设计的系统将表分割开,用RDBMS的方式的话,对于一对多的关系经常使用JOIN查询将两张表连接起来。但是如果将表分割开了之后,也就是两张表不在同一个数据库,不在同一个服务器上怎样使用JOIN操作,这里需要注意的是如果是用where in操作不是省了一些麻烦了嘛。
557.Mysql的引擎有哪些?支持事物么?DB储存引擎有哪些?
MySQL有多种存储引擎,每种存储引擎有各自的优缺点,可以择优选择使用:
MyISAM、InnoDB、MERGE、MEMORY(HEAP)、BDB(BerkeleyDB)、EXAMPLE、FEDERATED、ARCHIVE、CSV、BLACKHOLE。
MySQL支持数个存储引擎作为对不同表的类型的处理器。MySQL存储引擎包括处理事务安全表的引擎和处理非事务安全表的引擎。
· MyISAM管理非事务表。它提供高速存储和检索,以及全文搜索能力。MyISAM在所有MySQL配置里被支持,它是默认的存储引擎,除非你配置MySQL默认使用另外一个引擎。
· MEMORY存储引擎提供“内存中”表。MERGE存储引擎允许集合将被处理同样的MyISAM表作为一个单独的表。就像MyISAM一样,MEMORY和MERGE存储引擎处理非事务表,这两个引擎也都被默认包含在MySQL中。
注释:MEMORY存储引擎正式地被确定为HEAP引擎。
· InnoDB和BDB存储引擎提供事务安全表。BDB被包含在为支持它的操作系统发布的MySQL-Max二进制分发版里。InnoDB也默认被包括在所 有MySQL 5.1二进制分发版里,你可以按照喜好通过配置MySQL来允许或禁止任一引擎。
· EXAMPLE存储引擎是一个“存根”引擎,它不做什么。你可以用这个引擎创建表,但没有数据被存储于其中或从其中检索。这个引擎的目的是服务,在 MySQL源代码中的一个例子,它演示说明如何开始编写新存储引擎。同样,它的主要兴趣是对开发者。
· NDB Cluster是被MySQL Cluster用来实现分割到多台计算机上的表的存储引擎。它在MySQL-Max 5.1二进制分发版里提供。这个存储引擎当前只被Linux, Solaris, 和Mac OS X 支持。在未来的MySQL分发版中,我们想要添加其它平台对这个引擎的支持,包括Windows。
· ARCHIVE存储引擎被用来无索引地,非常小地覆盖存储的大量数据。
· CSV存储引擎把数据以逗号分隔的格式存储在文本文件中。
· BLACKHOLE存储引擎接受但不存储数据,并且检索总是返回一个空集。
· FEDERATED存储引擎把数据存在远程数据库中。在MySQL 5.1中,它只和MySQL一起工作,使用MySQL C Client API。在未来的分发版中,我们想要让它使用其它驱动器或客户端连接方法连接到另外的数据源。
558.以下是学生考试结果表
fnamekechengfenshu张三语文81张三数学65李四语文76李四数学90王五语文61王五数学100王五英语90
1.请用一条sql语句从t_result表中查询出每门课都大于75分的学生姓名;
select b.fname from
(select fname,count(kecheng) c from t_result group by fname)a,
(Select fname,kecheng,count(fname) c from t_result where fenshu >75 group by fname)b
where a.fname = b.fname and a.c = b.c
2.请用一条sql写出总分排名前三的学生姓名,总分,平均分
select fname,sum(fenshu),avg(fenshu) from t_result GROUP By fname order by SUM(fenshu) desc;
559.库中已经存在雇用表表名:
org_employee;表中字段:雇员编号(emp_id),雇员姓名(em_name),雇员年龄(emp_age),雇员部门(depart_name);请写出执行以下操作的sql语句:
1)向表中增加一条数据:雇员编号(1001),雇员姓名(张三),雇员年龄(24),雇员部门(研发部);
INSERT INTO org_employee
VALUES(‘1001’,’张三’,’24’,’研发部’);
2)查询雇员年龄在55(包含)至60(不包含)岁之间的雇员数据
SELECT * FROM org_employee
WHERE emp_age>=55 and emp_age <60;
3)分部门查询各个部门的雇员数量
SELECT COUNT(*),depart_name group by depart_name;
4)删除姓名为张三的雇员数据
Delete from org_employee where em_name =’张三’;
5)在表中增加一个日期类型的字段雇员出生日期,字段为emp_brithday
Alter table org_employee add(emp_brithday date);
6)将表org_employee删除
drop org_employee;
560.如下表1中的数据,表名为:t_test,记录某场比赛的结果。
请用sql语句实现表2的查询结果
表1
IDmatchdateresult12015-02-04胜22015-02-04负32015-02-04胜42015-04-07胜52015-04-07胜62015-04-07胜
表2
比赛日期胜负2015-02-04212015-04-0712
SQL语句:

561.请将如下数据库语句进行优化,使其执行效率更高(提示:…不需要更改)

优化的理由:not in 和not exists
如果查询语句使用了not in 那么内外表都进行全表扫描,没有用到索引;
而not extsts 的子查询依然能用到表上的索引。所以无论那个表大,用not exists 都比not in 要快。
562.请简述如何将Oracle中的数据库转至DB2中,需要保证表结构和数据不变
使用ETL工具,如infomatic,datastage,kettle等,可以完成异构数据库的迁移
以kettle为例
表输入选择 oracle库
表输出选择DB库
循环执行可以进行全库迁移
563.学生成绩表
姓名:name课程:subject分数:score学号:stuid张三数学891张三语文801张三英语701李四数学902李四语文702李四英语802
1.计算每个人的总成绩并排名(要求显示字段:姓名,总成绩)
select name,sum(score) s from t_stu GROUP BY name;
2.列出各门课程成绩最好的学生(要求显示字段:学号,姓名,科目,成绩)
select t1.stuid,t1.name,t1.subject,t1.score from t_stu t1,
(select subject,MAX(score) as maxscore from t_stu group by subject)t2
where t1.subject = t2.subject and t1.score = t2.maxscore;
3.列出各个课程的平均成绩(要求显示字段;课程,平均成绩)
select subject,AVG(score)平均成绩 from t_stu
group by subject;
564.Oracl数据库中有两张表Stu(学生表)和Grade(分数表),如下图所示:
Stu表
sid(学生ID)sname(姓名)sage(年龄)1张三232李四253王五24
Grade表
gid(分数主键)cid(课程ID)sid(学生主键)grade(分数)123862227931280411815137062178
请写sql统计出有两门以上的课的分数在80分以上的学生的姓名和年龄?
Select sname,sage from Stu where Stu.sid in (
Select sid from Grade where grade >80
)
565.下面是学生表(Student)的结构说明:
字段名称字段解释字段类型字段长度约束s_id学号字符10PKs_name学生姓名字符50Not nulls_age学生年龄数值3Not nulls-sex学生性别字符(男:1女:0)1Not null
下面是教师表(Teacher )的结构说明
字段名称字段解释字段类型字段长度约束t_id教师编号字符10PKt_name教师名字字符50Not null
下面是课程表(Course)的结构说明
字段名称字段解释字段类型字段长度约束c_id课程编号字符10PKc_name课程名字字符50Not nullt_id教师编号字符10Not null
下面是成绩表(SC)的结构说明
字段名称字段解释字段类型字段长度约束s_id学号字符10PKc_id课程编号字符10Not nullscore成绩数值3Not null
查询同名同姓学生名单,并统计同名人数
select 姓名,count(学号) as num
from 学生表
group by 姓名
having count(学号)>1 --保证查找到的都是存在2个以上(包括2)的同名同姓的姓名及人数。
查询平均成绩大于60分的学生的学号和平均成绩;
Select s_id,avg(score) from sc groupby s_id having avg(score)>60
查询姓“李”的老师的个数;
Select count(*),teacher.t_name from teacher where teacher.t_name like '李%'
566.取出sql表中低31到40的记录(以自动增长ID为主键)
Sql server方案:
select top 10 * from t where id not in
(select top 30 id from t order by id ) orde by id
Mysql方案:select * from t order by id limit 30,10
Oracle方案:
select rownum num,tid from (select rownum num,tid from t_test) where num>=30 and num<=41;
567.下列两个表,需要用一条sql语句把b表中的ID和NAME 字段的数值复制到A表中
A表
IDNAME
B表
IDNAMEOTHER1AaaDdd2BbbEee
insert into a select id,name from b;
568.什么是基本表,什么是视图,两者的区别和联系是什么?
它是从一个或几个基本表中导出的 表,是从现有基本表中抽取若干子集组成用户的“专用表”。
基本表:基本表的定义指建立基本关系模式,
而变更则是指对数据库中已存在的基本表进行删除与修改。
区别:
1、视图是已经编译好的sql语句。而表不是
2、视图没有实际的物理记录。而表有。
3、表是内容,视图是窗口
4、表只用物理空间而视图不占用物理空间,
视图只是逻辑概念的存在,表可以及时对它进行修改,
但视图只能有创建的语句来修改
5、表是内模式,试图是外模式
6、视图是查看数据表的一种方法,
可以查询数据表中某些字段构成的数据,
只是一些SQL语句的集合。从安全的角度说,
视图可以不给用户接触数据表,从而不知道表结构。
7、表属于全局模式中的表,是实表;视图属于局部模式的表,
是虚表。
8、视图的建立和删除只影响视图本身,不影响对应的基本表。
联系:视图(view)是在基本表之上建立的表,它的结构(
即所定义的列)和内容(即所有数据行)都来自基本表,
它依据基本表存在而存在。一个视图可以对应一个基本表,
也可以对应多个基本表。
视图是基本表的抽象和在逻辑意义上建立的新关系
569.什么是事务?什么是锁?
事务与锁是不同的。事务具有ACID(原子性、一致性、隔离性和持久性),锁是用于解决隔离性的一种机制。事务的隔离级别通过锁的机制来实现。另外锁有不同的粒度,同时事务也是有不同的隔离级别的(一般有四种:读未提交Read uncommitted,
读已提交Read committed,
可重复读Repeatable read,
可串行化Serializable)。
在具体的程序设计中,开启事务其实是要数据库支持才行的,如果数据库本身不支持事务,那么仍然无法确保你在程序中使用的事务是有效的。
锁可以分为乐观锁和悲观锁:
悲观锁:认为在修改数据库数据的这段时间里存在着也想修改此数据的事务;
乐观锁:认为在短暂的时间里不会有事务来修改此数据库的数据;
我们一般意义上讲的锁其实是指悲观锁,在数据处理过程中,将数据置于锁定状态(由数据库实现)
如果开启了事务,在事务没提交之前,别人是无法修改该数据的;如果rollback,你在本次事务中的修改将撤消(不是别人修改的会没有,因为别人此时无法修改)。当然,前提是你使用的数据库支持事务。还有一个要注意的是,部分数据库支持自定义SQL锁覆盖事务隔离级别默认的锁机制,如果使用了自定义的锁,那就另当别论。
重点:一般事务使用的是悲观锁(具有排他性)
570.Student学生表(学号,姓名、性别、年龄、组织部门),Course 课程表(编号,课程名称),Sc选课表(学号,课程编号,成绩)
写一个SQL语句,查询选修了计算机原理的学生学号和姓名
select 学号,姓名 from Student where 学号 in
(select 学号 from Sc where 课程编号 in
(Select 课程编号 from Course where 课程名称 = ‘计算机原理’))
写一个SQL语句,查询“周星驰”同学选修了的课程名字
select 课程名称 from Course where 编号 in (
select Sc.课程编号 from Student,Sc where Student.姓名=’周星驰’ and Student.学号 = Sc.学号)
写一个SQL语句,查询选修了5门课程的学生学号和姓名
Select 学号,姓名 from Student where 学号 in (
Select 学号,count(课程编号) from Sc group by 学号 having count(课程编号)>=5)
571.sql查询
Student(S#,Sname,Sage,Ssex)学生表
S#:学号
Sname:学生姓名
Sage:学生年龄
Ssex: 学生性别
Course(C#,Cname,T#)课程表
C#,课程编号;
Cname:课程名字;
T#:教师编号;
SC(S#,C#,score)成绩表
S#:学号;
C#,课程编号;
Score:成绩;
Teacher(T#,Tname)教师表
T#:教师编号;
Tname:教师名字
查询“001”课程比“002”课程成绩高的所有学生学号
select SC1.S#
from SC SC1 JOIN SC SC2 ON SC1.S#=SC2.S#
WHERE SC1.C#='001' AND SC2.C#='002' AND SC1.score>SC2.score
查询平均成绩大于60分的同学的学号和平均成绩
select S#,AVG(score) 平均成绩
from SC
group by S#
having AVG(score)>60
查询所有同学的学号、姓名、选课数、总成绩
select Student.S#,Sname,COUNT(*) 选课数,SUM(score) 总成绩
from Student JOIN SC on Student.S#=SC.S#
group by Student.S#,Sname
查询姓“李”的老师的个数
Select count(*) from Teacher where Tname like ‘李%’;
查询没学过“叶平”老师课的同学的学号、姓名
SELECT stu2.s#,stu2.stuname FROM Student stu2 WHERE stu2.s# NOT IN
(SELECT DISTINCT stu.s# FROM student stu, course c,teacher tea,score score
WHERE stu.s#= score.s# AND course.c#= score.c#
AND tea.t#= course.t#AND tea.tname= '叶平' )
JVM
572.简述Java内存管理机制,以及垃圾回收的原理和使用过Java调优工具
内存管理的职责为分配内存,回收内存。 没有自动内存管理的语言/平台容易发生错误。
典型的问题包括悬挂指针问题,一个指针引用了一个已经被回收的内存地址,导致程序的运行完全不可知。
另一个典型问题为内存泄露,内存已经分配,但是已经没有了指向该内存的指针,导致内存泄露。 程序员要花费大量时间在调试该类问题上。
573.描述JVM加载class文件的原理机制
JVM中类的装载是由类加载器(ClassLoader)和它的子类来实现的,Java中的类加载器是一个重要的Java运行时系统组件,它负责在运行时查找和装入类文件中的类。
由于Java的跨平台性,经过编译的Java源程序并不是一个可执行程序,而是一个或多个类文件。当Java程序需要使用某个类时,JVM会确保这个类已经被加载、连接(验证、准备和解析)和初始化。类的加载是指把类的.class文件中的数据读入到内存中,通常是创建一个字节数组读入.class文件,然后产生与所加载类对应的Class对象。加载完成后,Class对象还不完整,所以此时的类还不可用。当类被加载后就进入连接阶段,这一阶段包括验证、准备(为静态变量分配内存并设置默认的初始值)和解析(将符号引用替换为直接引用)三个步骤。最后JVM对类进行初始化,包括:1)如果类存在直接的父类并且这个类还没有被初始化,那么就先初始化父类;2)如果类中存在初始化语句,就依次执行这些初始化语句。
类的加载是由类加载器完成的,类加载器包括:根加载器(BootStrap)、扩展加载器(Extension)、系统加载器(System)和用户自定义类加载器(java.lang.ClassLoader的子类)。从Java 2(JDK 1.2)开始,类加载过程采取了父亲委托机制(PDM)。PDM更好的保证了Java平台的安全性,在该机制中,JVM自带的Bootstrap是根加载器,其他的加载器都有且仅有一个父类加载器。类的加载首先请求父类加载器加载,父类加载器无能为力时才由其子类加载器自行加载。JVM不会向Java程序提供对Bootstrap的引用。下面是关于几个类加载器的说明:
Bootstrap:一般用本地代码实现,负责加载JVM基础核心类库(rt.jar);
Extension:从java.ext.dirs系统属性所指定的目录中加载类库,它的父加载器是Bootstrap;
System:又叫应用类加载器,其父类是Extension。它是应用最广泛的类加载器。它从环境变量classpath或者系统属性java.class.path所指定的目录中记载类,是用户自定义加载器的默认父加载器。
574.说说JVM原理?内存泄漏与溢出的区别?何时产生内存泄漏?
答:JVM原理:
JVM是Java Virtual Machine(Java虚拟机)的缩写,它是整个java实现跨平台的最核心的部分,所有的Java程序会首先被编译为.class的类文件,这种类文件可以在虚拟机上执行,也就是说class并不直接与机器的操作系统相对应,而是经过虚拟机间接与操作系统交互,由虚拟机将程序解释给本地系统执行。JVM是Java平台的基础,和实际的机器一样,它也有自己的指令集,并且在运行时操作不同的内存区域。JVM通过抽象操作系统和CPU结构,提供了一种与平台无关的代码执行方法,即与特殊的实现方法、主机硬件、主机操作系统无关。JVM的主要工作是解释自己的指令集(即字节码)到CPU的指令集或对应的系统调用,保护用户免被恶意程序骚扰。JVM对上层的Java源文件是不关心的,它关注的只是由源文件生成的类文件(.class文件)。
内存泄漏与溢出的区别:
1) 内存泄漏是指分配出去的内存无法回收了。
2) 内存溢出是指程序要求的内存,超出了系统所能分配的范围,从而发生溢出。比如用byte类型的变量存储10000这个数据,就属于内存溢出。
3) 内存溢出是提供的内存不够;内存泄漏是无法再提供内存资源。
何时产生内存泄漏:
1) 静态集合类:在使用Set、Vector、HashMap等集合类的时候需要特别注意,有可能会发生内存泄漏。当这些集合被定义成静态的时候,由于它们的生命周期跟应用程序一样长,这时候,就有可能会发生内存泄漏。
2) 监听器:在Java中,我们经常会使用到监听器,如对某个控件添加单击监听器addOnClickListener(),但往往释放对象的时候会忘记删除监听器,这就有可能造成内存泄漏。好的方法就是,在释放对象的时候,应该记住释放所有监听器,这就能避免了因为监听器而导致的内存泄漏。
3) 各种连接:Java中的连接包括数据库连接、网络连接和io连接,如果没有显式调用其close()方法,是不会自动关闭的,这些连接就不能被GC回收而导致内存泄漏。一般情况下,在try代码块里创建连接,在finally里释放连接,就能够避免此类内存泄漏。
4) 外部模块的引用:调用外部模块的时候,也应该注意防止内存泄漏。如模块A调用了外部模块B的一个方法,如:public void register(Object o)。这个方法有可能就使得A模块持有传入对象的引用,这时候需要查看B模块是否提供了去除引用的方法,如unregister()。这种情况容易忽略,而且发生了内存泄漏的话,比较难察觉,应该在编写代码过程中就应该注意此类问题。
5) 单例模式:使用单例模式的时候也有可能导致内存泄漏。因为单例对象初始化后将在JVM的整个生命周期内存在,如果它持有一个外部对象(生命周期比较短)的引用,那么这个外部对象就不能被回收,而导致内存泄漏。如果这个外部对象还持有其它对象的引用,那么内存泄漏会更严重,因此需要特别注意此类情况。这种情况就需要考虑下单例模式的设计会不会有问题,应该怎样保证不会产生内存泄漏问题。
575.GC线程是否为守护线程?
GC线程是守护线程。线程分为守护线程和非守护线程(即用户线程)。只要当前JVM实例中尚存在任何一个非守护线程没有结束,守护线程就全部工作;只有当最后一个非守护线程结束时,守护线程随着JVM一同结束工作。
576.Java的类加载器都有哪些,每个类加载器都有加载那些类,什么是双亲委派模型,是做什么的?
类加载器按照层次,从顶层到底层,分为以下三种:
(1)启动类加载器(Bootstrap ClassLoader)
这个类加载器负责将存放在JAVA_HOME/lib下的,或者被-Xbootclasspath参数所指定的路径中的,并且是虚拟机识别的类库加载到虚拟机内存中。启动类加载器无法被Java程序直接引用。
(2)扩展类加载器(Extension ClassLoader)
这个加载器负责加载JAVA_HOME/lib/ext目录中的,或者被java.ext.dirs系统变量所指定的路径中的所有类库,开发者可以直接使用扩展类加载器
(3)应用程序类加载器(Application ClassLoader)
这个加载器是ClassLoader中getSystemClassLoader()方法的返回值,所以一般也称它为系统类加载器。它负责加载用户类路径(Classpath)上所指定的类库,可直接使用这个加载器,如果应用程序没有自定义自己的类加载器,一般情况下这个就是程序中默认的类加载器
双亲委派模型:
双亲委派模型要求除了顶层的启动类加载器外,其他的类加载器都应当有自己的父类加载器。这里类加载器之间的父子关系一般不会以继承关系来实现,而是都使用组合关系来复用父加载器的代码
工作过程:
如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,每一个层次的类加载器都是如此,因此所有的加载请求最终都应该传递到顶层的启动类加载器中,只有当父类加载器反馈自己无法完成这个请求(它的搜索范围中没有找到所需的类)时,子加载器才会尝试自己去加载。
好处:
Java类随着它的类加载器一起具备了一种带有优先级的层次关系。例如类Object,它放在rt.jar中,无论哪一个类加载器要加载这个类,最终都是委派给启动类加载器进行加载,因此Object类在程序的各种类加载器环境中都是同一个类,判断两个类是否相同是通过classloader.class这种方式进行的,所以哪怕是同一个class文件如果被两个classloader加载,那么他们也是不同的类。
577.垃圾回收器(GC)的基本原理是什么?垃圾回收器可以马上回收内存吗?如何通知虚拟机进行垃圾回收?
1、对于GC来说,当程序员创建对象时,GC就开始监控这个对象的地址、大小以及使用情况。通常,GC采用有向图的方式记录和管理堆(heap)中的所有对象。通过这种方式确定哪些对象是"可达的",哪些对象是"不可达的"。当GC确定一些对象为"不可达”时,GC就有责任回收这些内存空间。
2、可以。程序员可以手动执行System.gc(),通知GC运行,但是Java语言规范并不保证GC一定会执行。
3. System.gc();或者Runtime.getRuntime().gc();
578.Java 中会存在内存泄漏吗,请简单描述。
答:理论上Java因为有垃圾回收机制(GC)不会存在内存泄露问题(这也是Java被广泛使用于服务器端编程的一个重要原因);然而在实际开发中,可能会存在无用但可达的对象,这些对象不能被GC回收也会发生内存泄露。一个例子就是hibernate的Session(一级缓存)中的对象属于持久态,垃圾回收器是不会回收这些对象的,然而这些对象中可能存在无用的垃圾对象。下面的例子也展示了Java中发生内存泄露的情况:

上面的代码实现了一个栈(先进后出(FILO))结构,乍看之下似乎没有什么明显的问题,它甚至可以通过你编写的各种单元测试。然而其中的pop方法却存在内存泄露的问题,当我们用pop方法弹出栈中的对象时,该对象不会被当作垃圾回收,即使使用栈的程序不再引用这些对象,因为栈内部维护着对这些对象的过期引用(obsolete reference)。在支持垃圾回收的语言中,内存泄露是很隐蔽的,这种内存泄露其实就是无意识的对象保持。如果一个对象引用被无意识的保留起来了,那么垃圾回收器不会处理这个对象,也不会处理该对象引用的其他对象,即使这样的对象只有少数几个,也可能会导致很多的对象被排除在垃圾回收之外,从而对性能造成重大影响,极端情况下会引发Disk Paging(物理内存与硬盘的虚拟内存交换数据),甚至造成OutOfMemoryError。
579.GC 是什么?为什么要有GC?
答:GC是垃圾收集的意思,内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的显示操作方法。Java程序员不用担心内存管理,因为垃圾收集器会自动进行管理。要请求垃圾收集,可以调用下面的方法之一:System.gc() 或Runtime.getRuntime().gc() ,但JVM可以屏蔽掉显示的垃圾回收调用。
垃圾回收可以有效的防止内存泄露,有效的使用可以使用的内存。垃圾回收器通常是作为一个单独的低优先级的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清除和回收,程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。在Java诞生初期,垃圾回收是Java最大的亮点之一,因为服务器端的编程需要有效的防止内存泄露问题,然而时过境迁,如今Java的垃圾回收机制已经成为被诟病的东西。移动智能终端用户通常觉得iOS的系统比Android系统有更好的用户体验,其中一个深层次的原因就在于Android系统中垃圾回收的不可预知性。
补充:垃圾回收机制有很多种,包括:分代复制垃圾回收、标记垃圾回收、增量垃圾回收等方式。标准的Java进程既有栈又有堆。栈保存了原始型局部变量,堆保存了要创建的对象。Java平台对堆内存回收和再利用的基本算法被称为标记和清除,但是Java对其进行了改进,采用“分代式垃圾收集”。这种方法会跟Java对象的生命周期将堆内存划分为不同的区域,在垃圾收集过程中,可能会将对象移动到不同区域:
伊甸园(Eden):这是对象最初诞生的区域,并且对大多数对象来说,这里是它们唯一存在过的区域。
幸存者乐园(Survivor):从伊甸园幸存下来的对象会被挪到这里。
终身颐养园(Tenured):这是足够老的幸存对象的归宿。年轻代收集(Minor-GC)过程是不会触及这个地方的。当年轻代收集不能把对象放进终身颐养园时,就会触发一次完全收集(Major-GC),这里可能还会牵扯到压缩,以便为大对象腾出足够的空间。
与垃圾回收相关的JVM参数:
-Xms / -Xmx --- 堆的初始大小 / 堆的最大大小
-Xmn --- 堆中年轻代的大小
-XX:-DisableExplicitGC --- 让System.gc()不产生任何作用
-XX:+PrintGCDetail --- 打印GC的细节
-XX:+PrintGCDateStamps --- 打印GC操作的时间戳
Linux操作
580.请写出常用的linux指令不低于10个,请写出linux tomcat启动。
答:linux指令
arch 显示机器的处理器架构(1)
uname -m 显示机器的处理器架构(2)
shutdown -h now 关闭系统(1)
shutdown -r now 重启(1)
cd /home 进入 '/ home' 目录'
cd .. 返回上一级目录
cd ../.. 返回上两级目录
mkdir dir1 创建一个叫做 'dir1' 的目录'
mkdir dir1 dir2 同时创建两个目录
find / -name file1 从 '/' 开始进入根文件系统搜索文件和目录
find / -user user1 搜索属于用户 'user1' 的文件和目录
linuxtomcat启动
进入tomcat下的bin目录执行 ./catalina.sh start直接启动即可,然后使用tail -f /usr/local/tomcat6/logs/catalina.out查看tomcat启动日志。
581.当使用RMI技术实现远程方法调用时,能为远程对象生成Sub和Skeleton命令的是()
A.Mic
B.mid
C.mitegistry
D.policytool
答案:A
582.以下哪个是服务()
A.kill
B.tar
C.rsyne
D.policytool
答案:c
分析:
A:kill命令,常用于杀死进程;
B:tar命令,tar命令是Unix/Linux系统中备份文件的可靠方法,几乎可以工作于任何环境中,它的使用权限是所有用户
C:类unix系统下的数据镜像备份工具
D:在终端下输入lsof即可显示系统打开的文件,因为 lsof 需要访问核心内存和各种文件,所以必须以 root 用户的身份运行它才能够充分地发挥其功能
583.下面的网络协议中,面向连接的的协议是: ()
A.传输控制协议
B.用户数据报协议
C.网际协议
D.网际控制报文协议
答案:A
584.在/etc/fstab 文件中指定的文件系统加载参数中, () 参数一般用于CD-ROM 等移动设备。
A.defaults
B.sw
C.rw 和 ro
D.noauto
答案:D
585.Linux 文件权限一共10 位长度,分成四段,第三段表示的内容是 ()
A.文件类型B.文件所有者的权限C.文件所有者所在组的权限D.其他用户的权限
答案:C
586.终止一个前台进程可能用到的命令和操作 ()
A.kill
B.< CTRL >;+C
C.shut down
D.halt
答案:B
587.在使用mkdir 命令创建新的目录时,在其父目录不存在时先创建父目录的选项是 ()
A.-m
B.-d
C.-d
D.-p
答案:D
588.下面关于i 节点描述错误的是 ()
A.i 节点和文件是一一对应的(每个文件都有唯一一个索引结点号与之对应,而对于一个索引结点号,却可以有多个文件名与之对应)
B.i 节点能描述文件占用的块数
C.i 节点描述了文件大小和指向数据块的指针
D.通过i 节点实现文件的逻辑结构和物理结构的转换
答案:A
589.一个文件名字为rr.Z,可以用来解压缩的命令是: ()
A.tar
B.gzip
C.compress
D.uncompress
答案:D
590.具有很多C 语言的功能,又称过滤器的是 ()
A.csh
B.tcsh
C.awk
D.sed
答案:C
591.一台主机要实现通过局域网与另一个局域网通信,需要做的工作是 ()
A.配置域名服务器
B.定义一条本机指向所在网络的路由
C.定义一条本机指向所在网络网关的路由
D.定义一条本机指向目标网络网关的路由
答案:C
592.建立动态路由需要用到的文件有 ()
A./etc/hosts
B./etc/HOSTNAME
C./etc/resolv.conf
D./etc/gateways
答案:D
593.局域网的网络地址192.168.1.0/24,局域网络连接其它网络的网关地址是192.168.1.1。主机192.168.1.20 访问172.16.1.0/24 网络时,其路由设置正确的是 ()
A.route add –net 192.168.1.0 gw 192.168.1.1 netmask 255.255.255.0 metric 1
B.route add –net 172.16.1.0 gw 192.168.1.1 netmask 255.255.255.0 metric 1
C.route add –net 172.16.1.0 gw 172.16.1.1 netmask 255.255.255.0 metric 1
D.route add default 192.168.1.0 netmask 172.168.1.1 metric 1
答案:B
594.下列提法中,不属于ifconfig 命令作用范围的是 ()
A.配置本地回环地址
B.配置网卡的IP地址
C.激活网络适配器
D.加载网卡到内核中
答案:D
595.下列关于链接描述,错误的是()
A.硬链接就是让链接文件的i 节点号指向被链接文件的i 节点
B.硬链接和符号连接都是产生一个新的i 节点
C链接分为硬链接和符号链接
D.硬连接不能链接目录文件
答案:B
596.在局域网络内的某台主机用ping 命令测试网络连接时发现网络内部的主机都可以连同,而不能与公网连通,问题可能是()
A.主机IP设置有误
B.没有设置连接局域网的网关
C.局域网的网关或主机的网关设置有误
D.局域网DNS服务器设置有误
答案:C
597.下列文件中,包含了主机名到IP 地址的映射关系的文件是:
A./etc/HOSTNAME
B./etc/hosts
C./etc/resolv.conf
D./etc/networks
答案:B
598.不需要编译内核的情况是()
A.删除系统不用的设备驱动程序时B.升级内核时C.添加新硬件时D.将网卡激活
答案:D
599.在shell 中变量的赋值有四种方法,其中,采用name=12 的方法称 ()
A.直接赋值
B.使用read命令
C.使用命令行参数
D.使用命令的输出
答案:A
600.()命令可以从文本文件的每一行中截取指定内容的数据。
A.cp
B.dd
C.fmt
D.cut
答案:D
601.下列不是Linux 系统进程类型的是()
A.交互进程
B.批处理进程
C.守护进程
D.就绪进程
答案:D
602.在日常管理中,通常CPU 会影响系统性能的情况是: ()
A.CPU 已满负荷地运转
B.CPU 的运行效率为30%
C.CPU 的运行效率为50%
D.CPU 的运行效率为80%
答案:A
603.若一台计算机的内存为128MB,则交换分区的大小通常是
A.64MB
B.128MB
C.256MB
D.512MB
答案:C
604.在安装Linux 的过程中的第五步是让用户选择安装方式,如果用户希望安装部分组件(软件程序),并在选择好后让系统自动安装,应该选择的选项是()
A.full
B.expert
C.newbie
D.menu
答案:D
605.Linux 有三个查看文件的命令,若希望在查看文件内容过程中可以用光标上下移动来查看文件内容,应使用()命令
A.cat
B.more
C.less
D.menu
答案:C
606.下列信息是某系统用ps –ef 命令列出的正在运行的进程 ()进程是运行Internet 超级服务器,它负责监听Internet sockets 上的连接,并调用合适的服务器来处理接收的信息。
A.root 1 4.0 0.0 344 204? S 17:09 0:00 initB.root 2 0.0 0.1 2916 1520? S 17:09 0:00 /sbin/gettyC.root 3 0.0 0.2 1364 632? S 17:09 0:00 /usr/sbin/syslogdD.root 4 0.0 1344 1204? S 17:09 0:10 /usr/sbin/inetd
答案:D
607.在TCP/IP 模型中,应用层包含了所有的高层协议,在下列的一些应用协议中, ()是能够实现本地与远程主机之间的文件传输工作
A.telnet
B.FTP
C.SNMP
D.NFS
答案:B
608.当我们与某远程网络连接不上时,就需要跟踪路由查看,以便了解在网络的什么位置出现了问题,满足该目的的命令是()
A.ping
B.ifconfig
C.traceroute
D.netstat
答案:C
609.对名为fido 的文件用chmod 551 fido 进行了修改,则它的许可权是()
A.-rwxr-xr-x
B.-rwxr--r--
C.-r--r--r--
D.-r-xr-x—x
答案:C
610.用ls –al 命令列出下面的文件列表,()文件是符号连接文件
A.-rw-rw-rw- 2 hel-s users 56 Sep 09 11:05 hello
B.-rwxrwxrwx 2 hel-s users 56 Sep 09 11:05 goodbey
C.drwxr--r-- 1 hel users 1024 Sep 10 08:10 zhang
D.lrwxr--r-- 1 hel users 2024 Sep 12 08:12 cheng
答案:D
611.DNS 域名系统主要负责主机名和()之间的解析。
A.IP地址
B.MAC地址
C.网络地址
D.主机别名
答案:A
612.WWW 服务器是在Internet 上使用最为广泛,它采用的是()结构
A.服务器/工作站
B.B/S
C.集中式
D.分布式
答案:B
613.Linux 系统通过()命令给其他用户发消息。
A.less
B.mesg
C.write
D.echo to
答案:C
614.NFS 是()系统。
A.文件
B.磁盘
C.网络文件
D.操作
答案:C
615.()命令可以在Linux 的安全系统中完成文件向磁带备份的工作
A.cp
B.tr
C.dir
D.cpio
答案:D
由于字数限制,后续内容更加精彩,欢迎关注,整理不易,可否动动你的小手给小编来点更新的动力,希望对你们会有帮助!~