简体   繁体   English

Android Studio无法在OpenSUSE上启动(打开的文件太多)

[英]Android Studio won't start on OpenSUSE (too many files open)

I haven't posted on StackOverflow in quite a while, so forgive me if I'm placing this in the wrong area, but here's the issue: 我已经有一段时间没有在StackOverflow上发布文章了,所以请原谅我将其放在错误的位置,但这是问题所在:

I recently downloaded Android Studio for my relatively freshly installed OpenSUSE system, have installed openjdk-devel, and whenever I try to start studio.sh the splash screen comes up, makes it about 70% of the way through loading, and then spams the console with: 我最近为相对较新安装的OpenSUSE系统下载了Android Studio,已经安装了openjdk-devel,并且每当我尝试启动studio.sh时,都会显示启动屏幕,并在整个加载过程中出现70%的错误,然后向控制台发送垃圾邮件有:

 [ 7146] ERROR - j.util.io.ResizeableMappedFile - /home/user/.AndroidStudio1.3/system/caches/names.dat.len (Too many open files) java.io.FileNotFoundException: /home/user/.AndroidStudio1.3/system/caches/names.dat.len (Too many open files) at java.io.FileOutputStream.open(Native Method) at java.io.FileOutputStream.<init>(FileOutputStream.java:221) at java.io.FileOutputStream.<init>(FileOutputStream.java:171) at com.intellij.util.io.ResizeableMappedFile$1.execute(ResizeableMappedFile.java:119) at com.intellij.util.io.ResizeableMappedFile$1.execute(ResizeableMappedFile.java:114) at com.intellij.openapi.util.io.FileUtilRt.doIOOperation(FileUtilRt.java:700) at com.intellij.util.io.ResizeableMappedFile.writeLength(ResizeableMappedFile.java:114) at com.intellij.util.io.ResizeableMappedFile.readLength(ResizeableMappedFile.java:164) at com.intellij.util.io.ResizeableMappedFile.<init>(ResizeableMappedFile.java:55) at com.intellij.util.io.PersistentBTreeEnumerator.<init>(PersistentBTreeEnumerator.java:82) at com.intellij.util.io.PersistentEnumeratorDelegate.<init>(PersistentEnumeratorDelegate.java:38) at com.intellij.util.io.PersistentStringEnumerator.<init>(PersistentStringEnumerator.java:53) at com.intellij.util.io.PersistentStringEnumerator.<init>(PersistentStringEnumerator.java:46) at com.intellij.util.io.PersistentStringEnumerator.<init>(PersistentStringEnumerator.java:32) at com.intellij.openapi.vfs.newvfs.persistent.FSRecords$DbConnection.init(FSRecords.java:244) at com.intellij.openapi.vfs.newvfs.persistent.FSRecords$DbConnection.init(FSRecords.java:319) at com.intellij.openapi.vfs.newvfs.persistent.FSRecords$DbConnection.init(FSRecords.java:319) at com.intellij.openapi.vfs.newvfs.persistent.FSRecords$DbConnection.init(FSRecords.java:319) at com.intellij.openapi.vfs.newvfs.persistent.FSRecords$DbConnection.init(FSRecords.java:319) at com.intellij.openapi.vfs.newvfs.persistent.FSRecords$DbConnection.init(FSRecords.java:319) at com.intellij.openapi.vfs.newvfs.persistent.FSRecords$DbConnection.init(FSRecords.java:319) at com.intellij.openapi.vfs.newvfs.persistent.FSRecords$DbConnection.init(FSRecords.java:319) at com.intellij.openapi.vfs.newvfs.persistent.FSRecords$DbConnection.init(FSRecords.java:319) at com.intellij.openapi.vfs.newvfs.persistent.FSRecords$DbConnection.init(FSRecords.java:319) at com.intellij.openapi.vfs.newvfs.persistent.FSRecords$DbConnection.connect(FSRecords.java:160) at com.intellij.openapi.vfs.newvfs.persistent.FSRecords.connect(FSRecords.java:518) at com.intellij.openapi.vfs.newvfs.persistent.PersistentFSImpl.initComponent(PersistentFSImpl.java:89) at com.intellij.openapi.components.impl.ComponentManagerImpl$ComponentConfigComponentAdapter$1.getComponentInstance(ComponentManagerImpl.java:568) at com.intellij.openapi.components.impl.ComponentManagerImpl$ComponentConfigComponentAdapter.getComponentInstance(ComponentManagerImpl.java:610) at com.intellij.util.pico.DefaultPicoContainer.getLocalInstance(DefaultPicoContainer.java:245) at com.intellij.util.pico.DefaultPicoContainer.getComponentInstance(DefaultPicoContainer.java:211) at org.picocontainer.defaults.BasicComponentParameter.resolveInstance(BasicComponentParameter.java:77) at org.picocontainer.defaults.ComponentParameter.resolveInstance(ComponentParameter.java:114) at org.picocontainer.defaults.ConstructorInjectionComponentAdapter.getConstructorArguments(ConstructorInjectionComponentAdapter.java:257) at org.picocontainer.defaults.ConstructorInjectionComponentAdapter$1.run(ConstructorInjectionComponentAdapter.java:217) at org.picocontainer.defaults.ThreadLocalCyclicDependencyGuard.observe(ThreadLocalCyclicDependencyGuard.java:53) at org.picocontainer.defaults.ConstructorInjectionComponentAdapter.getComponentInstance(ConstructorInjectionComponentAdapter.java:248) at com.intellij.util.pico.ConstructorInjectionComponentAdapter.getComponentInstance(ConstructorInjectionComponentAdapter.java:58) at com.intellij.openapi.components.impl.ComponentManagerImpl$ComponentConfigComponentAdapter$1.getComponentInstance(ComponentManagerImpl.java:550) at com.intellij.openapi.components.impl.ComponentManagerImpl$ComponentConfigComponentAdapter.getComponentInstance(ComponentManagerImpl.java:610) at com.intellij.util.pico.DefaultPicoContainer.getLocalInstance(DefaultPicoContainer.java:245) at com.intellij.util.pico.DefaultPicoContainer.getComponentInstance(DefaultPicoContainer.java:211) at org.picocontainer.defaults.CollectionComponentParameter.getArrayInstance(CollectionComponentParameter.java:268) at org.picocontainer.defaults.CollectionComponentParameter.resolveInstance(CollectionComponentParameter.java:127) at org.picocontainer.defaults.ComponentParameter.resolveInstance(ComponentParameter.java:116) at org.picocontainer.defaults.ConstructorInjectionComponentAdapter.getConstructorArguments(ConstructorInjectionComponentAdapter.java:257) at org.picocontainer.defaults.ConstructorInjectionComponentAdapter$1.run(ConstructorInjectionComponentAdapter.java:217) at org.picocontainer.defaults.ThreadLocalCyclicDependencyGuard.observe(ThreadLocalCyclicDependencyGuard.java:53) at org.picocontainer.defaults.ConstructorInjectionComponentAdapter.getComponentInstance(ConstructorInjectionComponentAdapter.java:248) at com.intellij.util.pico.ConstructorInjectionComponentAdapter.getComponentInstance(ConstructorInjectionComponentAdapter.java:58) at com.intellij.openapi.components.impl.ComponentManagerImpl$ComponentConfigComponentAdapter$1.getComponentInstance(ComponentManagerImpl.java:550) at com.intellij.openapi.components.impl.ComponentManagerImpl$ComponentConfigComponentAdapter.getComponentInstance(ComponentManagerImpl.java:610) at com.intellij.util.pico.DefaultPicoContainer.getLocalInstance(DefaultPicoContainer.java:245) at com.intellij.util.pico.DefaultPicoContainer.getComponentInstance(DefaultPicoContainer.java:211) at com.intellij.openapi.components.impl.ComponentManagerImpl.getComponentFromContainer(ComponentManagerImpl.java:168) at com.intellij.openapi.application.impl.ApplicationImpl.getComponentFromContainer(ApplicationImpl.java:533) at com.intellij.openapi.components.impl.ComponentManagerImpl.getComponent(ComponentManagerImpl.java:199) at com.intellij.openapi.components.impl.ComponentManagerImpl.getComponent(ComponentManagerImpl.java:194) at com.intellij.openapi.vfs.VirtualFileManager.getInstance(VirtualFileManager.java:44) at com.intellij.openapi.vfs.LocalFileSystem$LocalFileSystemHolder.<clinit>(LocalFileSystem.java:40) at com.intellij.openapi.vfs.LocalFileSystem.getInstance(LocalFileSystem.java:44) at com.intellij.openapi.components.impl.stores.ApplicationStoreImpl$1.beforeFileBasedStorageCreate(ApplicationStoreImpl.java:85) at com.intellij.openapi.components.impl.stores.StateStorageManagerImpl.createFileStateStorage(StateStorageManagerImpl.java:212) at com.intellij.openapi.components.impl.stores.StateStorageManagerImpl.createStateStorage(StateStorageManagerImpl.java:185) at com.intellij.openapi.components.impl.stores.StateStorageManagerImpl.getStateStorage(StateStorageManagerImpl.java:102) at com.intellij.openapi.components.impl.stores.ComponentStoreImpl.initPersistentComponent(ComponentStoreImpl.java:315) at com.intellij.openapi.components.impl.stores.ComponentStoreImpl.initComponent(ComponentStoreImpl.java:75) at com.intellij.openapi.application.impl.ApplicationImpl.initializeComponent(ApplicationImpl.java:177) at com.intellij.openapi.components.impl.ComponentManagerImpl$ComponentConfigComponentAdapter$1.getComponentInstance(ComponentManagerImpl.java:566) at com.intellij.openapi.components.impl.ComponentManagerImpl$ComponentConfigComponentAdapter.getComponentInstance(ComponentManagerImpl.java:610) at com.intellij.util.pico.DefaultPicoContainer.getLocalInstance(DefaultPicoContainer.java:245) at com.intellij.util.pico.DefaultPicoContainer.getComponentInstance(DefaultPicoContainer.java:211) at com.intellij.openapi.components.impl.ComponentManagerImpl.createComponent(ComponentManagerImpl.java:125) at com.intellij.openapi.application.impl.ApplicationImpl.createComponent(ApplicationImpl.java:354) at com.intellij.openapi.components.impl.ComponentManagerImpl.createComponents(ComponentManagerImpl.java:116) at com.intellij.openapi.components.impl.ComponentManagerImpl.init(ComponentManagerImpl.java:87) at com.intellij.openapi.components.impl.stores.ApplicationStoreImpl.load(ApplicationStoreImpl.java:101) at com.intellij.openapi.application.impl.ApplicationImpl.load(ApplicationImpl.java:499) at com.intellij.openapi.application.impl.ApplicationImpl.load(ApplicationImpl.java:481) at com.intellij.idea.IdeaApplication.run(IdeaApplication.java:170) at com.intellij.idea.MainImpl$1$1$1.run(MainImpl.java:52) at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:312) at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:745) at java.awt.EventQueue.access$300(EventQueue.java:103) at java.awt.EventQueue$3.run(EventQueue.java:706) at java.awt.EventQueue$3.run(EventQueue.java:704) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) at java.awt.EventQueue.dispatchEvent(EventQueue.java:715) at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:362) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138) at java.awt.EventDispatchThread.run(EventDispatchThread.java:91) [ 7150] ERROR - j.util.io.ResizeableMappedFile - Android Studio 1.3.1 Build #AI-141.2135290 [ 7151] ERROR - j.util.io.ResizeableMappedFile - JDK: 1.7.0_85 [ 7151] ERROR - j.util.io.ResizeableMappedFile - VM: OpenJDK Server VM [ 7151] ERROR - j.util.io.ResizeableMappedFile - Vendor: Oracle Corporation [ 7151] ERROR - j.util.io.ResizeableMappedFile - OS: Linux 

And I'm sort of at my wit's end here. 我有点机智。 I've tried linking to both openjdk as well as Oracle's latest JDK version. 我尝试链接到openjdk和Oracle的最新JDK版本。 I've tried playing with the number of maximum open files (set in /etc/environment/limits.conf), but that doesn't seem to do anything despite the error indicating an abundance of open files. 我试过玩最大打开文件数(在/etc/environment/limits.conf中设置),但是尽管错误表明打开文件过多,但似乎没有任何作用。 I've tried upgrading to openjdk1.8, downgrading to 1.7, reinstalling everything multiple times, but I just can't seem to launch the thing. 我曾尝试升级到openjdk1.8,降级到1.7,多次重新安装所有内容,但我似乎无法启动它。

Is this a legitimate bug or critical user error? 这是合法错误还是严重的用户错误? Any ideas about where I could look to maybe solve this? 关于我可以寻找解决方案的任何想法?

Edit: /etc/environment/limits.conf 编辑:/etc/environment/limits.conf

 # /etc/security/limits.conf # #Each line describes a limit for a user in the form: # #<domain> <type> <item> <value> # #Where: #<domain> can be: # - a user name # - a group name, with @group syntax # - the wildcard *, for default entry # - the wildcard %, can be also used with %group syntax, # for maxlogin limit # #<type> can have the two values: # - "soft" for enforcing the soft limits # - "hard" for enforcing hard limits # #<item> can be one of the following: # - core - limits the core file size (KB) # - data - max data size (KB) # - fsize - maximum filesize (KB) # - memlock - max locked-in-memory address space (KB) # - nofile - max number of open files # - rss - max resident set size (KB) # - stack - max stack size (KB) # - cpu - max CPU time (MIN) # - nproc - max number of processes # - as - address space limit (KB) # - maxlogins - max number of logins for this user # - maxsyslogins - max number of logins on the system # - priority - the priority to run user process with # - locks - max number of file locks the user can hold # - sigpending - max number of pending signals # - msgqueue - max memory used by POSIX message queues (bytes) # - nice - max nice priority allowed to raise to values: [-20, 19] # - rtprio - max realtime priority # #<domain> <type> <item> <value> # #* soft core 0 #* hard rss 10000 #@student hard nproc 20 #@faculty soft nproc 20 #@faculty hard nproc 50 #ftp hard nproc 0 #@student - maxlogins 4 * hard nofile 65535 * soft nofile 65535 root soft nofile 65535 root hard nofile 65535 # End of file 

uname -a 优名

 Linux susebart 3.16.7-21-desktop #1 SMP PREEMPT Tue Apr 14 07:11:37 UTC 2015 (93c1539) i686 i686 i386 GNU/Linux 

cat /proc/version cat / proc / version

 Linux version 3.16.7-21-desktop (geeko@buildhost) (gcc version 4.8.3 20140627 [gcc-4_8-branch revision 212064] (SUSE Linux) ) #1 SMP PREEMPT Tue Apr 14 07:11:37 UTC 2015 (93c1539) 

Here's some mysterious output from the shell: 这是shell的一些神秘输出:

$ whoami
corey
$ ulimit -Hn
256
$ ulimit -Sn
256
$ su 
$ whoami
root
$ ulimit -Hn
65535
$ ulimit -Sn
65535
$ su corey
$ whoami
corey
$ ulimit -Hn
65535
$ ulimit -Sn
65535
$ exit
$ exit // getting back to login shell
$ whoami
corey
$ ulimit -Hn
256
$ ulimit -Sn
256

So it looks like the limits are changed properly when a new shell is opened (even without switching to root first in the case of the nested su above), but not when the machine is started or new shells are opened. 因此,看起来好像在打开新的外壳程序时正确更改了限制(对于上面的嵌套su而言,即使不先切换到root),但在启动计算机或打开新的外壳程序时也不会更改。 I confirmed that by running su USERNAME ./studio.sh I'm able to start the program at last, so at least that exists as a workaround. 我确认通过运行su USERNAME ./studio.sh终于可以启动该程序了,因此至少可以解决该问题。 Any clue what's going on with the shell instances though? 有什么线索可说,shell实例是怎么回事?

As for now that's what is going on: 至于现在,这是怎么回事:

$ whoami        //session 1 (256)
corey
$ ulimit -Hn
256
$ ulimit -Sn
256
$ su            //session 2 (65k)
$ whoami
root
$ ulimit -Hn
65535
$ ulimit -Sn
65535
$ su corey      //session 3 (65k)
$ whoami
corey
$ ulimit -Hn
65535
$ ulimit -Sn
65535
$ exit      //session 2(65k)
$ exit     // getting back to login shell: session 1 (256)
$ whoami
corey
$ ulimit -Hn
256
$ ulimit -Sn
256

The su command makes it possible to change a login session's owner (ie, the user who originally created that session by logging on to the system) without the owner having to first log out of that session. su命令使更改登录会话的所有者(即最初通过登录系统创建该会话的用户)成为可能, 所有者不必先注销该会话。 So, when you log out 2 times (from root and corey sessions) you return to the initial session in which your old limits seem to work. 因此,当您注销两次(从root和corey会话)时,您将返回到原来的限制似乎起作用的初始会话。 I have no idea how this could be if you rebooted system properly, so I just advice you to relogin (meaning explicitly log out and log in) under corey , I bet new values from limits.conf should finally apply. 我不知道这怎么会是,如果你重新启动系统正常,所以我建议你重新登录下(意味着明确注销和登录) corey ,我敢打赌,从新值limits.conf应最后申请。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM