java项目的pid是什么,在java web开发中数据库应放在哪个目录下
大家好,今天小编来为大家解答java项目的pid是什么这个问题,在java web开发中数据库应放在哪个目录下很多人还不知道,现在让我们一起来看看吧!
如何定位java内存泄露
1、为什么会发生内存泄漏
Java如何检测内在泄漏呢?我们需要一些工具进行检测,并发现内存泄漏问题,不然很容易发生down机问题。
编写java程序最为方便的地方就是我们不需要管理内存的分配和释放,一切由jvm来进行处理,当java对象不再被应用时,等到堆内存不够用时,jvm会进行垃圾回收,清除这些对象占用的堆内存空间,如果对象一直被应用,jvm无法对其进行回收,创建新的对象时,无法从Heap中获取足够的内存分配给对象,这时候就会导致内存溢出。而出现内存泄露的地方,一般是不断的往容器中存放对象,而容器没有相应的大小限制或清除机制。容易导致内存溢出。
当服务器应用占用了过多内存的时候,如何快速定位问题呢?现在,Eclipse MAT的出现使这个问题变得非常简单。EclipseMAT是著名的SAP公司贡献的一个工具,可以在Eclipse网站下载到它,完全免费的。
要定位问题,首先你需要获取服务器jvm某刻内存快照。jdk自带的jmap可以获取内存某一时刻的快照,导出为dmp文件后,就可以用Eclipse MAT来分析了,找出是那个对象使用内存过多。
2、内存泄漏的现象:
常常地,程序内存泄漏的最初迹象发生在出错之后,在你的程序中得到一个OutOfMemoryError。这种典型的情况发生在产品环境中,而在那里,你希望内存泄漏尽可能的少,调试的可能性也达到最小。也许你的测试环境和产品的系统环境不尽相同,导致泄露的只会在产品中暴露。这种情况下,你需要一个低负荷的工具来监听和寻找内存泄漏。同时,你还需要把这个工具同你的系统联系起来,而不需要重新启动他或者机械化你的代码。也许更重要的是,当你做分析的时候,你需要能够同工具分离而使得系统不会受到干扰。
一个OutOfMemoryError常常是内存泄漏的一个标志,有可能应用程序的确用了太多的内存;这个时候,你既不能增加JVM的堆的数量,也不能改变你的程序而使得他减少内存使用。但是,在大多数情况下,一个OutOfMemoryError是内存泄漏的标志。一个解决办法就是继续监听GC的活动,看看随时间的流逝,内存使用量是否会增加,如果有,程序中一定存在内存泄漏。
3、发现内存泄漏
1. jstat-gc pid
可以显示gc的信息,查看gc的次数,及时间。
其中最后五项,分别是young gc的次数,young gc的时间,full gc的次数,full gc的时间,gc的总时间。
2.jstat-gccapacity pid
可以显示,VM内存中三代(young,old,perm)对象的使用和占用大小,
如:PGCMN显示的是最小perm的内存使用量,PGCMX显示的是perm的内存最大使用量,
PGC是当前新生成的perm内存占用量,PC是但前perm内存占用量。
其他的可以根据这个类推,OC是old内纯的占用量。
3.jstat-gcutil pid
统计gc信息统计。
4.jstat-gcnew pid
年轻代对象的信息。
5.jstat-gcnewcapacity pid
年轻代对象的信息及其占用量。
6.jstat-gcold pid
old代对象的信息。
7.stat-gcoldcapacity pid
old代对象的信息及其占用量。
8.jstat-gcpermcapacity pid
perm对象的信息及其占用量。
9.jstat-class pid
显示加载class的数量,及所占空间等信息。
10.jstat-compiler pid
显示VM实时编译的数量等信息。
11.stat-printcompilation pid
当前VM执行的信息。
一些术语的中文解释:
S0C:年轻代中第一个survivor(幸存区)的容量(字节)
S1C:年轻代中第二个survivor(幸存区)的容量(字节)
S0U:年轻代中第一个survivor(幸存区)目前已使用空间(字节)
S1U:年轻代中第二个survivor(幸存区)目前已使用空间(字节)
EC:年轻代中Eden(伊甸园)的容量(字节)
EU:年轻代中Eden(伊甸园)目前已使用空间(字节)
OC:Old代的容量(字节)
OU:Old代目前已使用空间(字节)
PC:Perm(持久代)的容量(字节)
PU:Perm(持久代)目前已使用空间(字节)
YGC:从应用程序启动到采样时年轻代中gc次数
YGCT:从应用程序启动到采样时年轻代中gc所用时间(s)
FGC:从应用程序启动到采样时old代(全gc)gc次数
FGCT:从应用程序启动到采样时old代(全gc)gc所用时间(s)
GCT:从应用程序启动到采样时gc用的总时间(s)
NGCMN:年轻代(young)中初始化(最小)的大小(字节)
NGCMX:年轻代(young)的最大容量(字节)
NGC:年轻代(young)中当前的容量(字节)
OGCMN:old代中初始化(最小)的大小(字节)
OGCMX:old代的最大容量(字节)
OGC:old代当前新生成的容量(字节)
PGCMN:perm代中初始化(最小)的大小(字节)
PGCMX:perm代的最大容量(字节)
PGC:perm代当前新生成的容量(字节)
S0:年轻代中第一个survivor(幸存区)已使用的占当前容量百分比
S1:年轻代中第二个survivor(幸存区)已使用的占当前容量百分比
E:年轻代中Eden(伊甸园)已使用的占当前容量百分比
O:old代已使用的占当前容量百分比
P:perm代已使用的占当前容量百分比
S0CMX:年轻代中第一个survivor(幸存区)的最大容量(字节)
S1CMX:年轻代中第二个survivor(幸存区)的最大容量(字节)
ECMX:年轻代中Eden(伊甸园)的最大容量(字节)
DSS:当前需要survivor(幸存区)的容量(字节)(Eden区已满)
TT:持有次数限制
MTT:最大持有次数限制
如果定位内存泄漏问题我一般使用如下命令:
Jstat-gcutil15469 2500 70
[root@ssss logs]# jstat-gcutil 15469 1000 300
S0 S1 E O P YGC YGCT FGC FGCT GCT
0.00 1.46 26.54 4.61 30.14 35 0.872 0 0.000 0.872
0.00 1.46 46.54 4.61 30.14 35 0.872 0 0.000 0.872
0.00 1.46 47.04 4.61 30.14 35 0.872 0 0.000 0.872
0.00 1.46 65.19 4.61 30.14 35 0.872 0 0.000 0.872
0.00 1.46 67.54 4.61 30.14 35 0.872 0 0.000 0.872
0.00 1.46 87.54 4.61 30.14 35 0.872 0 0.000 0.872
0.00 1.46 88.03 4.61 30.14 35 0.872 0 0.000 0.872
1.48 0.00 5.56 4.62 30.14 36 0.874 0 0.000 0.874
1000代表多久间隔显示一次,
100代表显示一次。
S0— Heap上的 Survivor space 0区已使用空间的百分比
S1— Heap上的 Survivor space 1区已使用空间的百分比
E— Heap上的 Eden space区已使用空间的百分比
O— Heap上的 Old space区已使用空间的百分比
P— Perm space区已使用空间的百分比
YGC—从应用程序启动到采样时发生 Young GC的次数
YGCT–从应用程序启动到采样时 Young GC所用的时间(单位秒)
FGC—从应用程序启动到采样时发生 Full GC的次数
FGCT–从应用程序启动到采样时 Full GC所用的时间(单位秒)
GCT—从应用程序启动到采样时用于垃圾回收的总时间(单位秒)
如果有大量的FGC就要查询是否有内存泄漏的问题了,图中的FGC数量就比较大,并且执行时间较长,这样就会导致系统的响应时间较长,如果对jvm的内存设置较大,那么执行一次FGC的时间可能会更长。
如果为了更好的证明FGC对服务器性能的影响,我们可以使用java visualVM来查看一下:
从上图可以发现执行FGC的情况,下午3:10分之前是没有FGC的,之后出现大量的FGC。
上图是jvm堆内存的使用情况,下午3:10分之前的内存回收还是比较合理,但是之后大量内存无法回收,最后导致内存越来越少,导致大量的full gc。
下面我们在看看大量full GC对服务器性能的影响,下面是我用loadrunner对我们项目进行压力测试相应时间的截图:
从图中可以发现有,在进行full GC后系统的相应时间有了明显的增加,点击率和吞吐量也有了明显的下降。所以java内存泄漏对系统性能的影响是不可忽视的。
3、定位内存泄漏
当然通过上面几种方法我们可以发现java的内存泄漏问题,但是作为一名合格的高级工程师,肯定不甘心就把这样的结论交给开发,当然这也的结论交给开发,开发也很难定位问题,为了更好的提供自己在公司的地位,我们必须给开发工程师提供更深入的测试结论,下面就来认识一下MemoryAnalyzer.exe。java内存泄漏检查工具利器。
首先我们必须对jvm的堆内存进行dump,只有拿到这个文件我们才能分析出jvm堆内存中到底存了些什么内容,到底在做什么?
MemoryAnalyzer的用户我在这里就不一一说明了,我的博客里也有说明,下面就展示我测试的成功图:
其中深蓝色的部分就为内存泄漏的部分,java的堆内存一共只有481.5M而内存泄漏的部分独自占有了336.2M所以本次的内存泄漏很明显,那么我就来看看那个方法导致的内存泄漏:
从上图我们可以发现红线圈着的方法占用了堆内存的67.75%,如果能把这个测试结果交给开发,开发是不是应该很好定位呢。所以作为一名高级测试工程师,我们需要学习的东西太多。
虽然不确定一定是内存泄漏,但是可以准确的告诉开发问题出现的原因,有一定的说服力。
在java web开发中数据库应放在哪个目录下
在java web开发中数据库应放在哪个目录下?
数据库是专门用来存储数据的,它是一个产品。web项目里面需要用到数据库连接层,专门去和数据库打交道。也就是说,数据库不会专门放在一个web工程里,而是你的web工程去访问数据库。和数据库交互的框架,目前比较流行的有MyBiatis,hibrenate框架,很多企业都在用,其中MyBiatis更多一些。
jsp中连接数据库三个java包应放在myeclipse哪个目录下SRC地下
数据库是在哪个目录下面数据库是存贮在专门的数据库中的,你在后台备份后,备份文件会保存在data目录里。
您重新覆盖下这两个文件试下
themes/default/不存在
themes/default/library/不存在
在JAVA中,手动引入数据库驱动,都是放在tomcat中的哪个目录下呢?限于一个项目就在项目下的WEB-INF\lib目录中
所有项目共享在tomcat目录下的lib文件夹下
linux mysql数据库文件一般放在哪个目录下在linux中,如果不进行任何额外的指定,mysql数据库的默认安装的路径应该在/var/lib/mysql。
Sql2000应放在哪个目录下你只的是什么目录,如果安装的SQL程序的话,你可以随意安放,不用按照默认路径存放
mysql-connector-java放在哪个目录下webroot/web-inf
linux下的mongodb数据是放在哪个目录下的RedHat Linux常见的日志文件详述如下◆/var/log/boot.log
该文件记录了系统在引导过程中发生的事件,就是Linux系统开机自检过程显示的信息。
◆/var/log/cron
该日志文件记录crontab守护进程crond所派生的子进程的动作,前面加上用户、登录时间和PID,以及派生出的进程的动作。CMD的一个动作是cron派生出一个调度进程的常见情况。REPLACE(替换)动作记录用户对它的cron文件的更新,该文件列出了要周期性执行的任务调度。RELOAD动作在REPLACE动作后不久发生,这意味着cron注意到一个用户的cron文件被更新而cron需要把它重新装入内存。该文件可能会查到一些反常的情况。
◆/var/log/maillog
该日志文件记录了每一个发送到系统或从系统发出的电子邮件的活动。它可以用来查看用户使用哪个系统发送工具或把数据发送到哪个系统。
该文件的格式是每一行包含日期、主机名、程序名,后面是包含PID或内核标识的方括号、一个冒号和一个空格,最后是消息。该文件有一个不足,就是被记录的入侵企图和成功的入侵事件,被淹没在大量的正常进程的记录中。但该文件可以由/etc/syslog文件进行定制。由/etc/syslog.conf配置文件决定系统如何写入/var/messages。有关如何配置/etc/syslog.conf文件决定系统日志记录的行为,将在后面详细叙述。
◆/var/log/syslog
在JAVA web开发中怎么把Excel中的数据导入到oracle数据库中1.准备数据:在excel中构造出需要的数据
2.将excel中的数据另存为文本文件(有制表符分隔的)
3.将新保存到文本文件中的数据导入到pl*sql中
在pl*sql中选择tools--text importer,在出现的窗口中选择Data from Textfile,然后再选择Open data file,
在弹出的文件选择框中选中保存有数据的文本文件,此时将会看到data from textfile中显示将要导入的数据
4.在configuration中进行如下配置
注:如果不将Name in header勾选上会导致字段名也当做记录被导入到数据库中,从而导致数据错误
5.点击data to oracle,选择将要导入数据的表,并在fields中将文本中的字段与表中的字段进行关联
6.点击import按钮进行导入
7.查看导入的数据
OK,至此数据导入成功。
java类库在哪个目录下?通常在C:\Program Files\Java\jdk1.6.0_10\jre\lib\rt.jar下;
具体根据安装位置不同而不同;
1、首先需要检查你的系统是否安装了Java环境,
2、在“开始”==》"运行"==》输入“cmd”弹出命令窗口,在命令窗口中输入java或者javac后按回车键,发现有很多提示符命令。那么证明你的Java环境是安装成功了的。
3、在cmd中输入:java-verbose,命令行的最后,显示的就是jdk安装的路径。
java如何做权限管理
首先介绍下思路:
1、用户表 user;
2、角色表 role;
3、菜单 menu;
4、角色菜单权限表 role_menu;
5、用户菜单权限表 user_menu;
如图:
根据用户角色取出该角色所有权限,并对用户进行权限分配;注意菜单的按钮(新增、删除、修改)权限是放在中间表(user_menu)中的;
1、新增用户时,是要根据用户角色进行分配权限的一定记得批量添加;批量、批量、批量,重要的事情说三遍,不要查询角色权限,然后for循环,这样效率太低了;
SQL如下:
INSERT INTO sys_user_menu(UserId, MenuId, DelPower, UpdPower, InsPower, ViewPower)
SELECT#{userId} UserId, MenuId, 1 DelPower, 1 UpdPower, 1 InsPower, 1 ViewPower FROM sys_role_menu WHERE RoelId=#{roleId}
updPower默认都是有的所以都是1,这样根据角色查询出权限直接添加,响应时间大大提升;
2、修改用户角色也要记得重新分配用户权限哦!这个不能忘,可以用上面的方法;
业务方法:
如果角色没有修改,是不用重新分配权限的,所有userRole重置为 null,如果角色修改则删除原权限,重新进行分配;
3、最后要优化的就是根据用户查询权限的时候啦,我最开始是这样做的,查询角色权限,用户权限,返回到前端,前端进行处理;结果就是很卡基本上要三到四秒,
解决方案,一步到位;一个查询返回全部数据。
如下SQL:
SELECT menu.MenuId id, ParentId pid, MenuName text,
(SELECT COUNT(1) FROM sys_user_menu WHERE UserId=#{userId} AND MenuId= sm.MenuId) isShow,
(SELECT CONCAT(
(CASE WHEN smenu.InsPower= 1 THEN 1 ELSE 0 END),',',
(CASE WHEN smenu.DelPower= 1 THEN 1 ELSE 0 END),',',
(CASE WHEN smenu.UpdPower= 1 THEN 1 ELSE 0 END),',',
(CASE WHEN smenu.ViewPower= 1 THEN 1 ELSE 0 END))
FROM sys_user_menu smenu WHERE smenu.UserId=#{userId}
AND smenu.MenuId= sm.MenuId) MenuInfo
FROM sys_role_menu sm INNER JOIN sys_menu menu on sm.MenuId= menu.MenuId
WHERE RoelId=#{roleId}
首先根据角色ID查询出权限,然后子查询用户是否有该权限,有返回1木用返回 0;
最后按钮权限我是直接拼接成字符串,分别对应添加、删除、修改、查看 1有该按钮 0没有该按钮;
优化后不管是添加、修改用户,加载用户权限都能控制在 1~2秒;
如果你还想了解更多这方面的信息,记得收藏关注本站。